使用mysqldump工具的优点是简单易用、容易上手,缺点是停机时间较长,因此它适用于数据量不大,或者允许停机的时间较长的情况。
前提条件
RDS实例设置白名单、申请外网地址,以及创建数据库和账号。具体操作,请参见快速入门。
背景信息
由于RDS提供的关系型数据库服务与原生的数据库服务完全兼容,所以对用户来说,将原有数据库迁移到RDS实例的过程,与从一台MySQL服务器迁移到另外一台MySQL服务器的过程基本类似。
说明
- mysqldump迁移复杂,建议您使用DTS迁移数据,详情请参见DTS数据迁移方案概览。
- mysqldump的更多参数请参见MySQL官方文档。
适用场景
自建MySQL数据库迁移至RDS MySQL实例内。
注意事项
迁移后的表不区分大小写,统一变为小写。
操作步骤
- 使用mysqldump导出自建数据库的数据、存储过程、触发器和函数。
说明 导出期间请勿进行数据更新,耐心等待导出完成。
- 在Linux命令行下导出自建数据库的数据,命令如下:
mysqldump -h 127.0.0.1 -u root -p --opt --default-character-set=utf8 --hex-blob <自建数据库名> --skip-triggers --skip-lock-tables > /tmp/<自建数据库名>.sql
示例
mysqldump -h 127.0.0.1 -u root -p --opt --default-character-set=utf8 --hex-blob testdb --skip-triggers --skip-lock-tables > /tmp/testdb.sql
- 在Linux命令行下导出存储过程、触发器和函数,命令如下:
mysqldump -h 127.0.0.1 -u root -p --opt --default-character-set=utf8 --hex-blob <自建数据库名> -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/<自建数据库名>Trigger.sql
示例
mysqldump -h 127.0.0.1 -u root -p --opt --default-character-set=utf8 --hex-blob testdb -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/testdbTrigger.sql
说明 若数据库中没有使用存储过程、触发器和函数,可跳过此步骤。
- 在Linux命令行下导出自建数据库的数据,命令如下:
- 将导出的两个文件上传到ECS实例上,本例路径为/tmp。
说明 如果自建数据库原本就在ECS实例上,可跳过本步骤。
- 将导出的文件导入到目标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
- 导入成功后登录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
报错怎么解决?SQL脚本里面包括SUPER权限的语句,将相关语句删除再执行。