使用场景
用户当前使用云下自建MySQL作为数据存储中心,希望能迁移至天翼云DRDS。另外除了自建MySQL适用外,其他场景MySQL也适用,比如从其他云厂商的MySQL迁移,本方法同样适用,只需要确保“中间机器”网络能连通您的MySQL即可。
约束限制
- 为了保证数据完整性,需要先停止业务再进行数据迁移。
- 不支持以自动新建库或新建表的方式导入数据,因此,导入数据前务必先在DRDS控制台创建好相同名称的逻辑schema、逻辑表,然后再连接DRDS进行数据导入。
- 导入数据到DRDS之前,务必创建用户并分配schema权限给用户。
迁移前准备
- 准备可以访问云下MySQL的主机(假设为中间机器1)。
- 确保该主机与云下MySQL所在主机网络联通。也可以直接复用MySQL主机,即同一台机器。
- 该主机必须安装MySQL官方客户端,MySQL客户端版本建议为5.7。
- Redhat系列Linux安装命令:yum install mysql mysql-devel。
- Debian系列Linux安装命令:apt install mysql-client-5.7 mysql-client-core-5.7。
- 该主机的磁盘空间必须足够存放临时转储文件(SQL文件)。
- 开通DRDS 实例,并创建数据库用户、逻辑schema、逻辑表等,配置DRDS相分组属性等。
- 通过开通DRDS 实例。
- 开通MySQL实例,根据业务需求决定开通一个或多个。
- 通过DRDS控制台,关联上述开通的一个或多个MySQL实例到DRDS 实例。关联后,需要重启所有节点。
- 通过DRDS控制台创建数据库用户。
- 配置DRDS分组属性。设置prohibitCrossTransaction为false,表示允许执行跨节点update/delete语句。
- 准备可以访问云上DRDS的主机(假设为中间机器2)。
- 确保该主机与云上DRDS所在主机网络联通(比如同VPC下的ECS,或者DRDS绑定弹性公网IP,机器能访问该弹性公网IP)。
- 该主机必须安装MySQL官方客户端,MySQL客户端版本建议为5.7。
- Redhat系列Linux安装命令:yum install mysql mysql-devel。
- Debian系列Linux安装命令:apt install mysql-client-5.7 mysql-client-core-5.7。
说明中间机器1和中间机器2可以是同一台机器,也可以是不同机器。如果是同一台机器,则该机器的网络务必既能连通云下MySQL,也要能连通DRDS实例。如果不是同一台机器,则两台中间机器务必保证网络互通(用于SQL文件传输)。
表结构迁移(准备工作)
-
通过DRDS控制台创建schema(建议编码为utfb8mb4)。schema名称保持和云下MySQL一致。
-
导出MySQL上的表结构。
-
导出时针对每一个需要导出的库导出一个单独的SQL文件(也可以每个表单独一个文件),避免覆盖。
命令如下:mysqldump -h {DB_IP} -P {DB_PORT} -u {DB_USER} -p --no-data --compact {DB_NAME} {TABLE_NAME} > {mysql_table_info.sql}
参数解释如下:
参数 说明 备注 DB_IP 待导出数据的MySQL数据库IP。 必填。 DB_PORT 待导出数据的MySQL数据库端口。 必填。 DB_USER 待导出数据的MySQL数据库用户名。 必填。 DB_NAME 数据库名称。 必填。 TABLE_NAME 表名。 可选。本场景不需要该参数,即一次导出一个库的所有表。如有必要,可以多个同类型的表,用空格隔开。建议只导出与业务相关的表。 mysql_table_info.sql 生成的结构文件名。 必填。请确保每次导出的文件名不同,建议以“逻辑库名”+“”+“逻辑表名”+“”+“info”格式命名,以免被覆盖。建议后缀为.sql。 --no-data 不导出数据。 本场景保留。 --compact 关闭注释和头尾信息,同时开启以下选项:
--skip-add-drop-table
--skip-add-locks
--skip-comments
--skip-disable-keys
--skip-set-charset本场景保留。 -
针对以上生成的每个表结构sql文件,请注意务必手动打开文档并删除所有注释(用/* /的就是注释语句),比如 / !40101 SET @saved_cs_client = @@character_set_client */。
-
通过DRDS控制台在上面schema下创建逻辑表,表类型可以是单片表、分片表、全局表,请用户根据表用途及数据量增长趋势合理选择表类型。表名及表结构保持和云下MySQL的表一致。 将步骤3、4中生成的表结构SQL语句拷贝到“schema管理-库表管理-DDL任务”执行建表语句,等待所有SQL执行完毕,在“库表管理”页面为所有表设置分片算法。(如果表过多,可以分批粘贴进去执行。)
-
通过DRDS控制台为上述创建的用户分配schema权限(建议至少SELECT、UPDATE、INSERT、DELETE)。
导出数据
-
通过mysqldump工具导出云下MySQL数据。导出时针对每一个需要导出的库导出一个单独的SQL文件(也可以每个表单独一个文件),避免覆盖。
导出命令:mysqldump -h {DB_IP} -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}
参数解释如下:
参数 说明 备注 DB_IP 待导出数据的MySQL数据库IP。 必填。 DB_PORT 待导出数据的MySQL数据库端口。 必填。 DB_USER 待导出数据的MySQL数据库用户名。 必填。 DB_NAME 数据库名称。 必填。 TABLE_NAME 表名。 可选。本场景不需要该参数,即一次导出一个库的所有表。如有必要,可以多个同类型的表,用空格隔开。建议只导出与业务相关的表。 mysql_table_data.sql 生成的表数据文件名。 必填。请确保每次导出的文件名不同,建议以“逻辑库名”+“”+“逻辑表名”+“ ”+“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,则需要配置该参数。若5.6及以下,不用该参数。 本场景保留。 --where 只转储给定的WHERE条件选择的记录。 可选。 -
针对上述导出的SQL文件,需要去掉不必要的信息,保持文件中尽量只包括insert语句。去掉的信息包括:不必要的注释。
导入数据
-
将上面导出的所有SQL文件,上传到可以访问DRDS实例的主机上。
-
针对每个库(schema)分别导入SQL到DRDS实例上。
-
通过mysql客户端直连DRDS ,执行以下命令将数据导入DRDS。
命令如下:mysql -f -h {DBPROXY_IP} -P {DBPROXY_PORT} -u {DDPROXY_USER} -p {DB_NAME} < {mysql_table_data.sql}
参数解释如下:
参数 说明 备注 DBPROXY_IP 待导入的DRDS的VIP。 必填。 DBPROXY_PORT 待导入的DRDS的端口。 必填。 DDPROXY_USER 待导入的DRDS的用户名。 必填。 DB_NAME 逻辑schema名称。 必填。 mysql_table_data.sql 待导入的SQL文件。 必填。
验证数据
通过MySQL客户端直连MySQL和DRDS实例 ,分别查询表数据进行数据验证,比如查询表记录总数是否相等。