场景介绍
企业在华为云上已经购买并使用了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.7d. 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管理支持人员进 行定位。