• 沒有找到結果。

场景四:华为云上自建 RDS for MySQL 迁移到 DDM

场景介绍

企业在华为云上自建MySQL数据库,希望能使用DDM将数据进行分布式存储。

说明

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

迁移示意

11-4 华为云上自建 MySQL 迁移到 DDM 示意图

说明

自建MySQL所在服务器与目标DDM实例、RDS for MySQL实例必须处于相同VPC,且安全组配 置相同。

约束限制

● 华为云上自建MySQL所在ECS、新购DDM和RDS for MySQL实例建议配置相同 VPC和安全组。

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

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

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

迁移前准备

● 准备可以访问源华为云上自建MySQL所在ECS的ECS。

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

b. 源华为云上自建MySQL所在ECS、目标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. 导出源华为云上自建MySQL的数据表结构至SQL文本文件。

mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --single-transaction --set-gtid-purged=OFF --no-data --skip-add-locks --add-locks=false {DB_NAME}

{TABLE_NAME} > {mysql_table_schema.sql}

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

11-12 参数解释

参数 说明 备注

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-13 表迁移策略

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

步骤2 导出华为云上自建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-14所示。

11-14 参数解释

参数 说明 备注

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

必填

DB_PORT 数据库侦听端口 必填

参数 说明 备注

DB_USER 数据库用户 必填

--single-transaction 该选项在导出数据之前提交 一个BEGIN SQL语句,

BEGIN 不会阻塞任何应用

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

---complete-insert 使用完整的insert语句(包含

列名称)。

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

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

CREATE TABLE 语句。 ---skip-comments 关闭附加注释信息。 ---skip-add-locks 在导出数据时,控制加锁动

作,以避免因耗能引起的性 能问题。

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

的声明。

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

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

DB_NAME 数据库名称 必填

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

格隔开。

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

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

说明

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

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

步骤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数据库名称,如果导入的是单表,DB_NAME为RDS第一个分片 的物理数据库。

● 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 --hex-blob --set-gtid-purged=OFF --skip-add-locks --add-locks=false --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-add-locks --add-locks=false --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 $?

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

– 异常:切换业务数据源至源华为云上自建MySQL,联系DDM技术支持人员进 行定位。