使用mysqldump迁移MySQL数据

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

当您需要将数据量较小或者允许较长停机时间的自建MySQL迁移至RDS MySQL时,可以使用mysqldump工具轻松实现数据迁移。该工具可以将自建数据库的结构和数据导出到一个包含创建和插入数据SQL语句的文本文件中,从而确保数据的完整性和一致性。

前提条件

RDS实例设置白名单、申请外网地址,以及创建数据库和账号。具体操作,请参见快速入门

背景信息

由于RDS提供的关系型数据库服务与原生的数据库服务完全兼容,所以对用户来说,将原有数据库迁移到RDS实例的过程与从一台MySQL服务器迁移到另外一台MySQL服务器的过程基本类似。

说明

适用场景

自建MySQL数据库迁移至RDS MySQL或RDS MySQL Serverless实例内。

注意事项

默认情况下,自建库迁移到RDS以后表名统一变为小写。您可以通过如下两种方法让RDS MySQL或RDS MySQL Serverless实例区分表名大小写。

  • 在创建RDS MySQL或RDS MySQL Serverless实例时将表名大小写设置为区分大小写。更多信息,请参见创建RDS MySQL实例

  • 已经创建好的实例,可以在参数设置中将lower_case_table_names参数值设置为0以区分表名大小写。更多信息,请参见设置实例参数

    警告
    • lower_case_table_names参数设置为0后,务必不要再次设置为1,否则可能导致ERROR 1146 (42S02): Table doesn't exist错误,对业务造成严重影响。

    • RDS MySQL 8.0版本实例暂不支持修改该参数,请在创建实例时进行设置。

操作步骤

本文以Linux系统为例。在macOS的终端或者Windows的命令提示符下也可执行mysqldump命令。

  1. 使用mysqldump导出自建数据库的数据、存储过程、触发器和函数。

    重要
    • 导出期间请勿进行数据更新,耐心等待导出完成。

    • 下文中的user用户需要具备本文介绍的操作的相关权限。权限设置的详细操作,请参见权限设置

    1. 在Linux命令行下导出自建数据库的数据,命令如下:

      mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob <自建数据库名> --skip-triggers --skip-lock-tables > /tmp/<自建数据库名>.sql

      示例

      mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob testdb --skip-triggers --skip-lock-tables > /tmp/testdb.sql
    2. 在Linux命令行下导出存储过程、触发器和函数,命令如下:

      mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob <自建数据库名> -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/<自建数据库名>Trigger.sql

      示例

      mysqldump -h 127.0.0.1 -u user -p --opt --default-character-set=utf8 --hex-blob testdb -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/testdbTrigger.sql
      说明

      若数据库中没有使用存储过程、触发器和函数,可跳过此步骤。

  2. 将导出的两个文件上传到ECS实例上,本例路径为/tmp

    说明

    如果自建数据库原本就在ECS实例上,可跳过本步骤。

    result

  3. 将导出的文件导入到目标RDS中,命令如下:

    mysql -h <RDS实例连接地址> -P <RDS实例端口> -u <RDS实例账号> -p <RDS数据库名称> < /tmp/<自建数据库名>.sql
    mysql -h <RDS实例连接地址> -P <RDS实例端口> -u <RDS实例账号> -p <RDS数据库名称> < /tmp/<自建数据库名>Trigger.sql
    说明
    • RDS数据库名称需要是RDS实例上已创建的数据库。创建数据库操作,请参见管理数据库

    • RDS实例账号需要是高权限账号或具有读写权限的账号。

    示例

    mysql -h rm-bpxxxxx.mysql.rds.aliyuncs.com -P 3306 -u testuser -p testdb  < /tmp/testdb.sql
    mysql -h rm-bpxxxxx.mysql.rds.aliyuncs.com -P 3306 -u testuser -p testdb  < /tmp/testdbTrigger.sql
  4. 导入成功后登录RDS实例数据库中查看数据是否正常。具体操作,请参见通过DMS登录RDS数据库

常见问题

  • Q:OPERATION need to be executed set by ADMIN报错怎么解决?

    A:可能是SQL脚本里面包括视图,触发器,存储过程等对象的definer问题,或者含有set global类SQL导致。详情请参见RDS MySQL出现“OPERATION need to be executed set by ADMIN”报错

  • Q:Access denied; you need (at least one of) the SUPER privilege(s) for this operation报错怎么解决?

    A:SQL脚本里面包括SUPER权限的语句,将相关语句删除再执行。