场景二:其他云MySQL迁移到DDM
场景介绍
企业当前使用其他云MySQL实例,希望能使用华为云DDM将数据进行分布式存储。
迁移过程中可能会出现业务中断情况,中断时长与迁移数据量大小、网络情况相关。
迁移示意
约束限制
- 目标DDM实例、RDS for MySQL实例所在ECS必须保证网络互通。
- 为了保持数据完整性,需要先停止业务后再进行数据迁移。
- DDM不支持以自动新建库或者新建拆分表、广播表的方式导入数据。因此导入数据前需要先创建好相同名称的逻辑库,相同拆分表、广播表结构的逻辑表,然后再进行数据导入。各类逻辑表创建方式请参见表2。
- 目标DDM使用的RDS for MySQL与其他云的MySQL版本需要保持一致。
迁移前准备
- 准备可以访问其他云MySQL实例的ECS。
- 确保其他云MySQL实例和目标DDM实例、RDS for MySQL实例都与ECS网络互通。如果网络不通,数据导出后,通过其他中转服务器,将数据文件上传到华为云ECS。
- ECS已安装MySQL官方客户端,MySQL客户端版本建议为5.6或5.7。
- Redhat系列Linux安装命令:yum install mysql mysql-devel
- Debian系列Linux安装命令:apt install mysql-client-5.7 mysql-client-core-5.7
- ECS磁盘空间足够存放临时转储文件;ECS内存空间足够,可以用来比较转储文件。
- 准备DDM实例,并配置DDM账号、DDM逻辑库、DDM逻辑表等相关信息。
- 申请DDM实例,并在DDM控制台创建DDM账号、创建逻辑库。
- 导出其他云MySQL实例数据表结构至SQL文本文件。
- MySQL客户端版本为5.6和5.7时请执行以下命令:
mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --no-data --skip-add-locks --add-locks=false --skip-tz-utc {DB_NAME} {TABLE_NAME} > {mysql_table_schema.sql}
- MySQL客户端版本为8.0时请执行以下命令:
mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --no-data --skip-add-locks --add-locks=false --column-statistics=0 --skip-tz-utc {DB_NAME} {TABLE_NAME} > {mysql_table_schema.sql}
相关参数解释如表1所示。
表1 参数解释 参数
说明
备注
DB_ADDRESS
待导出数据的数据库连接地址。
必填
DB_PORT
数据库侦听端口
必填
DB_USER
数据库用户
必填
--skip-lock-tables
在不锁表的情况下导出数据。
某些参数会默认开启加锁声明,因此建议在数据导出语句末尾增加此参数。
--add-locks=false
导出的数据文件中不加锁表的声明。
-
--no-data
不导出任何数据,只导出数据库表结构。
导出表结构时使用。
--column-statistics=0
如果使用的MySQL客户端版本为8.0,则必须关闭该特性。
MySQL客户端版本为8.0时必填。
DB_NAME
数据库名称
必填
TABLE_NAME
表名
可以多个同类型的表,用空格隔开。建议只导出与业务相关的表结构
mysql_table_schema.sql
生成的表结构文件名。
每次导出表结构时文件名不同。
建议以“逻辑库名”+“_”+“逻辑表名”+“_”+“schema”格式命名,以免数据被覆盖。如mysql_table_schema.sql。
此处举例的参数为数据导出中常用的参数,由于mysqldump参数无法逐一列举,如果存在个别参数调优等特殊情况,请在MySQL官网查询。
- MySQL客户端版本为5.6和5.7时请执行以下命令:
- 创建逻辑表。
- 清理目标DDM实例的测试数据,防止和待迁移数据冲突。
- 准备RDS for MySQL实例。
导出数据
此处以本地IP连接的方式介绍,通过使用mysqldump工具来导出数据。
- 保障DDM实例的子网及虚拟私有云与客户端ECS实例保持一致。
- 放通安全组入方向规则。
从其他云MySQL实例中将表数据导出到单独的SQL文本文件中,然后上传至ECS。
- 停止自其他云MySQL实例的业务系统,否则可能会导致导出数据不是最新的。
- 导出其他云MySQL实例表数据至SQL文本文件。
- MySQL客户端版本为5.6和5.7时请执行以下命令:
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 --skip-tz-utc [--where=""] {DB_NAME}{TABLE_NAME} > {mysql_table_data.sql}
- MySQL客户端版本为8.0时请执行以下命令:
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 --column-statistics=0 --skip-tz-utc [--where=""] {DB_NAME}{TABLE_NAME} > {mysql_table_data.sql}
- 如果其他云MySQL实例中有多个逻辑库,建议分开多次执行该命令导出表数据。
- 如果其他云MySQL实例不支持mysqldump导出表数据方式,请联系管理员协助处理。
相关参数解释如表3所示。
表3 参数解释 参数
说明
备注
DB_ADDRESS
待导出数据的数据库连接地址。
必填
DB_PORT
数据库侦听端口
必填
DB_USER
数据库用户
必填
DB_NAME
数据库名称
必填
TABLE_NAME
表名
可以多个同类型的表,用空格隔开。
建议只导出与业务相关的表结构。
mysql_table_data.sql
生成的表数据文件名。
每次导出不同表时文件名不同。
建议以“逻辑库名”+“_”+“逻辑表名”+“_”+“data”格式命名,以免数据被覆盖。如mysql_table_data.sql。
--complete-insert
使用完整的insert语句(包含列名称)。
-
--single-transaction
该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。
-
--quick
不缓冲查询,直接导出到标准输出。
避免大数据情况内存爆涨。
--hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。
-
--no-create-info
只导出数据,而不添加CREATE TABLE 语句。
导出数据时使用。
--skip-comments
关闭附加注释信息。
-
--skip-lock-tables
在不锁表的情况下导出数据。
某些参数会默认开启加锁声明,因此建议在数据导出语句末尾增加此参数。
--add-locks=false
导出的数据文件中不加锁表的声明。
-
--skip-add-locks
在导出数据时,控制加锁动作,以避免因耗能引起的性能问题。
-
--set-gtid-purged=OFF
如果使用的MySQL版本为8.0或5.7,则需要配置该参数。
如果使用的MySQL版本为5.6或低于5.6,则不需要配置该参数。
--where
只转储给定的WHERE条件选择的记录。
如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。
此处举例的参数为数据导出中常用的参数,由于mysqldump参数无法逐一列举,如果存在个别参数调优等特殊情况,请在MySQL官网查询。
- MySQL客户端版本为5.6和5.7时请执行以下命令:
- 查看导出SQL文本文件的大小,验证导出数据是否成功。
- 如大小不为0字节,说明导出成功。
- 如大小为0字节,说明导出失败,请联系DDM管理人员。
- 将导出的SQL数据文件上传至已准备的ECS。
导入数据
- 开启应用程序访问DDM数据库只读开关。
- 清理目标DDM实例的测试数据,防止和待迁移数据冲突。
- 如果是单表或普通表,采用MySQL客户端直连DDM实例,直接执行以下命令导入表结构文本文件和数据文件。
mysql -f -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p {DB_NAME} < {mysql_table_schema.sql} Enter password: ********** mysql -f -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p {DB_NAME} < {mysql_table_data.sql} Enter password: **********
- DDM_ADDRESS为待导入数据的DDM实例的地址。
- DDM_PORT为DDM实例的端口。
- DDM_USER为DDM实例的用户名。
- DB_NAME为DDM逻辑库名称,如果导入的是单表,DB_NAME为DDM第一个分片的物理数据库。
- mysql_table_schema.sql为待导入的表结构文件名
- mysql_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} < {mysql_table_data.sql} Enter password: **********
- DDM_ADDRESS为待导入数据的DDM的地址。
- DDM_PORT为DDM侦听端口。
- DDM_USER为DDM用户。
- DB_NAME为DDM逻辑库名称。
- mysql_table_data.sql为待导入的表数据文件名。
- 数据导入阶段会在一定程度上影响DDM实例以及RDS for MySQL实例性能,请选择在业务低峰时间导入。
- 如果导入过程中出现中断或异常,为防止表数据主键冲突可以用SQL语句truncate table {TABLE_NAME}清空再重新导入。该命令属于高危操作,执行后会清空表中所有数据,请谨慎使用。
- 请勿把数据量大(超过500万)的数据导入到广播表。
数据验证
- 在ECS上对DDM实例进行逻辑备份。
- 导出表结构:
- MySQL客户端版本为5.6时请执行以下命令:
mysqldump -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p --skip-lock-tables --default-auth=mysql_native_password --set-gtid-purged=OFF --skip-tz-utc --no-data {DB_NAME} {TABLE_NAME} > {mysql_table_schema_new.sql}
- MySQL客户端版本为8.0时请执行以下命令:
mysqldump -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p --skip-lock-tables --default-auth=mysql_native_password --column-statistics=0 --set-gtid-purged=OFF --skip-tz-utc --no-data {DB_NAME} {TABLE_NAME} > {mysql_table_schema_new.sql}
- MySQL客户端版本为5.6时请执行以下命令:
- 导出表数据:
- MySQL客户端版本为5.6时请执行以下命令:
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 --skip-tz-utc [--where=""] {DB_NAME}{TABLE_NAME} > {mysq_table_data_new.sql}
- MySQL客户端版本为8.0时请执行以下命令:
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 --column-statistics=0 --skip-tz-utc [--where=""] {DB_NAME}{TABLE_NAME} > {mysq_table_data_new.sql}
- MySQL客户端版本为5.6时请执行以下命令:
- 导出表结构:
- 检查数据一致性。
- 在其他云RDS for MySQL和DDM实例执行如下SQL语句检查每张表的记录数是否相等。其中TABLE_NAME是表名。
select count(*) from {TABLE_NAME};
- 在ECS上对导出前后的表结构和表数据进行比较。
diff -B -w -q -i {mysql_table_schema.sql} {mysql_table_schema_new.sql};echo $? diff -B -w -q -i {mysql_table_data.sql} {mysql_table_data_new.sql};echo $?
- 表结构的导出命令只适用于单表和普通表。
- 如果导出数据的顺序不一致,无法比较。
- 如果导入前后相同,则表示数据迁移成功。
- 如果数据存在差异,建议联系DDM客服人员进行定位。
- 在其他云RDS for MySQL和DDM实例执行如下SQL语句检查每张表的记录数是否相等。其中TABLE_NAME是表名。
- 端到端验证应用程序通过DDM实例访问相关表只读功能是否正常。
- 关闭应用程序访问DDM数据库只读开关。
业务验证
- 切换业务数据源至DDM。
- 验证是否能正常读取、写入数据。
- 正常:完成迁移。
- 异常:切换业务数据源至其他云MySQL实例,联系DDM管理员进行定位。