• 沒有找到結果。

场景二:数据中心自建 RDS for MySQL 迁移到 DDM

场景介绍

企业当前使用数据中心自建MySQL,希望能使用DDM将数据进行分布式存储。

须知

迁移过程中可能会出现业务中断情况,中断时长与迁移数据量大小、网络情况相关。

迁移示意

11-2 数据中心自建 MySQL 迁移到 DDM 示意图

约束限制

● 目标DDM实例、RDS for MySQL实例所在ECS必须保证网络互通。

● 为了保持数据完整性,需要先停止业务后再进行数据迁移。

● DDM不支持以自动新建库或者新建拆分表、广播表的方式导入数据。因此导入数 据前需要先创建好相同名称的逻辑库,相同拆分表、广播表结构的逻辑表,然后 再进行数据导入。各类逻辑表创建方式请参见表11-7。

● 目标DDM使用的RDS for MySQL实例与自建MySQL的MySQL版本需要保持一 致。

迁移前准备

● 准备可以访问自建MySQL所在数据中心的ECS。

a. 确保自建MySQL所在数据中心和目标DDM实例、RDS for MySQL实例都与 ECS网络互通。

b. ECS已安装MySQL官方客户端,MySQL客户端版本建议为5.6或5.7。

Redhat系列Linux安装命令:yum install mysql mysql-devel

Debian系列Linux安装命令:apt install client-5.7 mysql-client-core-5.7

c. ECS磁盘空间足够存放临时转储文件;ECS内存空间足够,可以用来比较转储 文件。

● 准备DDM实例,并配置DDM帐号、DDM逻辑库、DDM逻辑表等相关信息。

a. 申请DDM实例,并在DDM控制台创建DDM帐号、创建逻辑库。

b. 导出自建MySQL数据表结构至SQL文本文件。

mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p--no-data --skip-add-locks --add---skip-add-locks=false {DB_NAME} {TABLE_NAME} > {mysql_table_schema.sql}

相关参数解释如表11-6所示。

11-6 参数解释

参数 说明 备注

DB_ADDRESS 待导出数据的数据库 连接地址。

必填

DB_PORT 数据库侦听端口 必填

DB_USER 数据库用户 必填

--skip-lock-tables 在不锁表的情况下导 出数据。

某些参数会默认开启加 锁声明,因此建议在数 据导出语句末尾增加此 参数。

--add-locks=false 导出的数据文件中不 加锁表的声明。 ---no-data 不导出任何数据,只

导出数据库表结构。

导出表结构时使用。

DB_NAME 数据库名称 必填

TABLE_NAME 表名 可以多个同类型的表,

用空格隔开。建议只导 盖。如mysql_table_schema.sq l。

创建前可先通过SQL语句:show create table {TABLE_NAME}查看自建MySQL中数 据表结构。

11-7 表迁移策略

– 保障DDM实例的子网及虚拟私有云与客户端ECS实例保持一致。

– 放通安全组入方向规则。

从数据中心自建MySQL中将表数据导出到单独的SQL文本文件中,然后上传至ECS。

步骤1 停止自建MySQL的业务系统,否则可能会导致导出数据不是最新的。

步骤2 打开MySQL客户端,输入如下命令,连接DDM实例,并导出自建MySQL表数据至SQL 文本文件。

mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --single-transaction --hex-blob --complete-insert --set-gtid-purged=OFF --quick --no-create-info --skip-comments --skip-add-locks --add---skip-add-locks=false [--where=""] {DB_NAME}{TABLE_NAME} > {mysq_table_data.sql}

说明

如果自建MySQL中有多个逻辑库,建议分开多次执行该命令导出表数据。

相关参数解释如表11-8所示。

11-8 参数解释

参数 说明 备注

DB_ADDRESS 待导出数据的数据库连 接地址。

必填

DB_PORT 数据库侦听端口 必填

DB_USER 数据库用户 必填

--complete-insert 使用完整的insert语句 (包含列名称)。 ---single-transaction 该选项在导出数据之前

提交一个BEGIN SQL语 句,BEGIN 不会阻塞任

--hex-blob 使用十六进制格式导出 二进制字符串字段。如 果有二进制数据就必须 使用该选项。

---no-create-info 只导出数据,而不添加

CREATE TABLE 语句。 导出数据时使用。

--skip-comments 关闭附加注释信息。 ---add-locks=false 导出的数据文件中不加

锁表的声明。

---set-gtid-purged=OFF 若使用的MySQL版本为 5.6或5.7,则需要配置 该参数。

若使用的MySQL版本低于 5.6,则不需要配置该参 数。

--skip-add-locks 在导出数据时,控制加 锁动作,以避免因耗能 引起的性能问题。

---where 只转储给定的WHERE条 件选择的记录。

如果条件包含命令解释符专 用空格或字符,一定要将条 件引用起来。

DB_NAME 数据库名称 必填

TABLE_NAME 表名 可以多个同类型的表,用空

格隔开。

建议只导出与业务相关的表 结构。

参数 说明 备注

mysq_table_data.sql 生成的表数据文件名。 每次导出不同表时文件名不 同。

● 此处举例的参数为数据导出中常用的参数,由于mysqldump参数无法逐一列举,如果存在个 别参数调优等特殊情况,请在MySQL官网查询或咨询DDM管理人员。

● 使用mysqldump工具进行转移MySQL数据时,请保持MySQL客户端版本和DDM所支持的 MySQL版本一致。如果版本不一致,可能会影响数据导出性能。

步骤3 查看导出SQL文本文件的大小,验证导出数据是否成功。

● 如大小不为0字节,说明导出成功。

● 如大小为0字节,说明导出失败,请联系DDM技术支持人员。

步骤4 将导出的SQL数据文件上传至已准备的ECS。

----结束

导入数据

步骤1 开启应用程序访问DDM数据库只读开关。

步骤2 清理目标DDM实例的测试数据,防止和待迁移数据冲突。

步骤3 如果是单表或普通表,采用MySQL客户端直连RDS for MySQL实例,直接执行以下命 令导入表结构文本文件和数据文件。

mysql -f -h {RDS_ADDRESS} -P {RDS_PORT} -u {RDS_USER} -p {DB_NAME} <

{mysql_table_schema.sql}

Enter password: **********

mysql -f -h {RDS_ADDRESS} -P {RDS_PORT} -u {RDS_USER} -p {DB_NAME} <

{mysq_table_data.sql}

Enter password: **********

● RDS_ADDRESS为待导入数据的RDS for MySQL实例的地址。

● RDS_PORT为RDS for MySQL实例的端口。

● RDS_USER为RDS for MySQL实例的用户名。

● DB_NAME为RDS for MySQL数据库名称,如果导入的是单表,DB_NAME为RDS for MySQL实例第一个分片的物理数据库。

● mysql_table_schema.sql为待导入的表结构文件名。

● mysq_table_data.sql为待导入的表数据文件名。

说明

单表或普通表导入前,需要编辑表结构文本文件,将最后一行信息删除(Dump completed on 2018-06-28 19:53:03),否则可能导致无法导入。

步骤4 如果是拆分表或广播表,采用MySQL客户端连接DDM将数据文件导入。

mysql -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p {DB_NAME} <

{mysq_table_data.sql}

Enter password: **********

● DDM_ADDRESS为待导入数据的DDM的地址。

● DDM_PORT为DDM侦听端口。

● DDM_USER为DDM用户。

● DB_NAME为DDM逻辑库名称。

● mysq_table_data.sql为待导入的表数据文件名。

须知

– 数据导入阶段会在一定程度上影响DDM实例以及RDS for MySQL实例性能,请 选择在业务低峰时间导入。

– 如果导入过程中出现中断或异常,为防止表数据主键冲突可以用SQL语句 truncate table

{TABLE_NAME}

清空再重新导入。该命令属于高危操作,执 行后会清空表中所有数据,请谨慎使用。

– 请勿把数据量大(超过500万)的数据导入到广播表。

----结束

数据验证

步骤1 在ECS上对DDM实例进行逻辑备份。

● 导出表结构:

mysqldump -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p --single-transaction --set-gtid-purged=OFF --no-data{DB_NAME} {TABLE_NAME} >

{mysql_table_schema_new.sql}

● 导出表数据:

mysqldump -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p

single-transaction hex-blob complete-insert set-gtid-purged=OFF quick no-create-info --skip-comments [--where=""] {DB_NAME}{TABLE_NAME} > {mysq_table_data_new.sql}

步骤2 检查数据一致性。

1. 在自建MySQL和DDM实例执行如下SQL语句检查每张表的记录数是否相等。其中 TABLE_NAME是表名。

select count(*) from {TABLE_NAME};

2. 在ECS上对导出前后的表结构和表数据进行比较。

diff -B -w -q -i {mysql_table_schema.sql} {mysql_table_schema_new.sql};echo $?

diff -B -w -q -i {mysq_table_data.sql} {mysq_table_data_new.sql};echo $?

– 如果导入前后相同,则表示数据迁移成功。

– 如果数据存在差异,建议联系DDM技术支持人员进行定位。

步骤3 端到端验证应用程序通过DDM实例访问相关表只读功能是否正常。

步骤4 关闭应用程序访问DDM数据库只读开关。

----结束

业务验证

1. 切换业务数据源至DDM。

2. 验证是否能正常读取、写入数据。

– 正常:完成迁移。

– 异常:切换业务数据源至自建MySQL,联系DDM管理人员进行定位。