文档首页> 分布式数据库中间件 DDM> 用户指南> 数据迁移> 场景一:从华为云RDS for MySQL迁移到DDM
更新时间:2022-05-11 GMT+08:00
分享

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

场景介绍

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

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

迁移示意

图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不支持以自动新建库或者新建拆分表、广播表的方式导入数据。因此导入数据前需要先创建好相同名称的逻辑库,相同拆分表、广播表结构的逻辑表,然后再进行数据导入。各类逻辑表创建方式请参见表2
  • 新增RDS for MySQL实例与源RDS的MySQL版本需要保持一致。

迁移前准备

  • 准备可以访问源RDS for MySQL实例、目标DDM实例,目标RDS for MySQL实例的ECS。
    1. 确保源RDS for MySQL实例、目标DDM实例,目标RDS for MySQL实例都在同一个VPC下,保证网络互通。
    2. 源RDS for MySQL实例、目标DDM实例,目标RDS for MySQL实例的安全组建议配置相同,如果不同则需要放开对应端口访问。
    3. 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
    1. ECS磁盘空间足够存放临时转储文件;ECS内存空间足够,可以用来比较转储文件。
  • 准备DDM实例,并配置DDM帐号、DDM逻辑库、DDM逻辑表等相关信息。
    1. 申请DDM实例,并在DDM控制台创建DDM帐号、创建逻辑库。

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

    2. 导出源RDS for MySQL实例数据表结构至SQL文本文件。
      • MySQL客户端版本为5.6和5.7时请执行以下命令:
        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} 
      • MySQL客户端版本为8.0时请执行以下命令:
        mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --skip-add-locks --add-locks=false --no-data --column-statistics=0 {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官网查询或咨询DDM技术支持人员。

    3. 创建逻辑表。
      创建逻辑表结构请与2中导出的表结构保持一致,把源表映射到目标DDM实例逻辑表,明确对应表结构和表数据的迁移策略,如表2所示。

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

      表2 表迁移策略

      逻辑库类型

      逻辑表类型

      表结构迁移策略

      表数据迁移策略

      拆分

      拆分表

      在原表结构基础上增加拆分键声明(详见建表语句说明文档),形成适用于DDM的建表语句,连接DDM并登录对应逻辑库后执行。

      通过DDM导入原表数据。

      拆分

      广播表

      在原表结构基础上增加广播声明(详见建表语句说明文档),形成适用于DDM的建表语句,连接DDM并登录对应逻辑库后执行。

      拆分

      单表

      获取原表建表语句,连接DDM并登录对应逻辑库后执行。

      非拆分

      单表

    1. 清理目标DDM实例的测试数据,防止和待迁移数据冲突。
  • 准备新RDS for MySQL实例。

导出数据

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

  • 前提条件
    • 保障DDM实例的子网及虚拟私有云与客户端ECS实例保持一致。
    • 放通安全组入方向规则。
  • 操作步骤
    从源RDS for MySQL实例中将表数据导出到单独的SQL文本文件中。
    1. 停止源RDS for MySQL实例的业务系统,否则可能会导致导出数据不是最新的。
    2. 打开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} > {mysql_table_data.sql}

      表3 参数解释

      参数

      说明

      备注

      DB_ADDRESS

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

      必填

      DB_PORT

      数据库侦听端口。

      必填

      DB_USER

      数据库用户。

      必填

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

      导出的数据文件中不加锁表的声明。

      -

      --set-gtid-purged=OFF

      若使用的MySQL版本为5.6或5.7,则需要配置该参数。

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

      --skip-add-locks

      在导出数据时,控制加锁动作,以避免因耗能引起的性能问题。

      -

      --where

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

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

      DB_NAME

      数据库名称。

      必填

      TABLE_NAME

      表名。

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

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

      mysql_table_data.sql

      生成的表数据文件名。

      每次导出不同表时文件名不同。

      建议以“逻辑库名”+“_”+“逻辑表名”+“_”+“data”格式命名,以免数据被覆盖。如mysql_table_data.sql。

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

    3. 查看导出SQL文本文件的大小,验证导出数据是否成功。
      • 如大小不为0字节,说明导出成功。
      • 如大小为0字节,说明导出失败,请联系DDM管理人员。

导入数据

  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} < {mysql_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为待导入的表结构文件名。
      • 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万)的数据导入到广播表。

数据验证

  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} > {mysql_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 {mysql_table_data.sql} {mysql_table_data_new.sql};echo $?
      • 如果导入前后相同,则表示数据迁移成功。
      • 如果数据存在差异,建议联系DDM技术支持人员进行定位。

  3. 端到端验证应用程序通过DDM实例访问相关表只读功能是否正常。
  4. 关闭应用程序访问DDM数据库只读开关。

业务验证

  1. 切换业务数据源至DDM。
  2. 验证是否能正常读取、写入数据。
    • 正常:完成迁移。
    • 异常:切换业务数据源至源RDS for MySQL实例,联系DDM管理支持人员进行定位。
分享:

    相关文档

    相关产品

close