• 沒有找到結果。

场景一:从华为云 RDS for MySQL 迁移到 DDM

场景介绍

企业在华为云上已经购买并使用了RDS for MySQL实例,希望能使用DDM将RDS for MySQL实例上的数据进行分布式存储。

说明

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

迁移示意

11-1 华为云 RDS for MySQL 实例迁移到 DDM 示意图

说明

源RDS for MySQL实例与目标DDM实例、新RDS for MySQL实例必须处于相同VPC,且安全组 配置相同。

总体迁移流程如下:

1. 迁移前准备

2. 将源RDS的数据导出到ECS

3. 把导出的源RDS数据导入到DDM实例

4. 导入后进行迁移前后数据一致性验证

5. 进行业务验证

约束限制

● 弹性云服务器(ECS)、源RDS、新购DDM和RDS for MySQL实例建议配置相同 VPC和安全组。

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

● 该场景不支持通过DDM关联老RDS for MySQL实例进行数据关联,需要将老RDS for MySQL实例数据导出后再导入到DDM实例进行数据分布式存储。

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

● 新增RDS for MySQL实例与源RDS的MySQL版本需要保持一致。

迁移前准备

● 准备可以访问源RDS for MySQL实例、目标DDM实例,目标RDS for MySQL实例 的ECS。

a. 确保源RDS for MySQL实例、目标DDM实例,目标RDS for MySQL实例都在 同一个VPC下,保证网络互通。

b. 源RDS for MySQL实例、目标DDM实例,目标RDS for MySQL实例的安全组 建议配置相同,如果不同则需要放开对应端口访问。

c. 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

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

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

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

具体申请实例数量请根据迁移评估合理规划。

b. 导出源RDS for MySQL实例数据表结构至SQL文本文件。

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

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

11-3 参数解释

参数 说明 备注

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

必填

DB_PORT 数据库侦听端口。 必填

DB_USER 数据库用户。 必填

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

数据。 某些参数会默认开启加锁声

明,因此建议在数据导出语 句末尾增加此参数。

--add-locks=false 导出的数据文件中不加

锁表的声明。

---no-data 不导出任何数据,只导 出数据库表结构。

导出表结构时使用。

DB_NAME 数据库名称。 必填

TABLE_NAME 表名。 可以多个同类型的表,用空 格隔开。

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

参数 说明 备注

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

导出数据

此处以本地IP连接的方式介绍,通过使用mysqldump工具来导出数据。

● 前提条件

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

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

● 操作步骤

从源RDS for MySQL实例中将表数据导出到单独的SQL文本文件中。

a. 停止源RDS for MySQL实例的业务系统,否则可能会导致导出数据不是最新 的。

b. 打开MySQL客户端,输入如下命令,连接DDM实例并导出数据。

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-locks=false [--where=""] {DB_NAME}{TABLE_NAME} > {mysq_table_data.sql}

11-5 参数解释

参数 说明 备注

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

必填

DB_PORT 数据库侦听端口。 必填

DB_USER 数据库用户。 必填

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

前提交一个BEGIN SQL语句,BEGIN 不 会阻塞任何应用程序

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

---no-create-info 只导出数据,而不添 加CREATE TABLE 语 句。

导出数据时使用。

参数 说明 备注 --skip-comments 关闭附加注释信息。 ---skip-lock-tables 在不锁表的情况下导

出数据。 某些参数会默认开启加

锁声明,因此建议在数 据导出语句末尾增加此 参数。

--add-locks=false 导出的数据文件中不 加锁表的声明。 ---set-gtid-purged=OFF 若使用的MySQL版本

为5.6或5.7,则需要 配置该参数。

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

--skip-add-locks 在导出数据时,控制 加锁动作,以避免因

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

用空格隔开。

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

mysq_table_data.sql 生成的表数据文件 名。

如mysq_table_data.sql。

说明

导入数据

步骤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第一个分片的物理数据库。

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

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

说明

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

● 如果是拆分表或广播表,采用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. 在源RDS for 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. 验证是否能正常读取、写入数据。

– 正常:完成迁移。

– 异常:切换业务数据源至源RDS for MySQL实例,联系DDM管理支持人员进 行定位。