AWS RDS-MySql数据手动迁移(涉及,视图触发器,存储过程,函数等数据)
用户需求
- 数据库迁移
- DMS无法支持存储过程等数据迁移
导入错误处理
-
描述
-
当数据库已启用二进制日志并且 mysqldump 文件包含对象(触发器、视图、函数或事件)时,会出现此错误。有关更多信息,请参阅 MySQL 文档中的二进制日志
-
如果任何 create 语句都不包含“NO SQL”、“READS SQL DATA”或“DETERMINISTIC”关键字,则 MySQL 无法创建这些对象,然后导入将失败,并出现错误 1227
-
注意:由于您无法更改默认参数组中的值,如果默认参数组目前与 RDS 数据库实例关联,则您必须将一个自定义参数组与您的 RDS 数据库实例关联。将新参数组与 RDS 数据库实例关联后,您必须重启 RDS 数据库实例
-
-
错误信息
Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation
- 解决方法
需要放宽此条件并允许导入所有对象,解决错误 1227,请将 log_bin_trust_function_creators 的参数组值更改为 1
- 变更方法
- 相关链接
1.创建临时EC2
- 在目标数据库Region创建临时EC2用于导出数据
2.安装mysqldump
- yum -y install mysql
3.导出数据
- mysqldump导出语句参考
mysqldump -h rds地址 \
-u 用户名 \
-p \
--single-transaction \
--routines \
--triggers \
--databases 导出数据库名称 \
--add-drop-database \
--compress \
--port 3306 > a.sql
参数 | 说明 |
---|---|
--single-transaction | 从服务器转储数据之前发出BEGIN SQL语句,保持数据一致性 |
--routines | 导出存储过程和函数 |
--triggers | 导出表的触发器 |
--add-drop-database | 在每个CREATE DATABASE语句之前添加DROP DATABASE语句 |
--compress | 压缩客户端和服务器之间发送的所有信息 |
4.导入数据
- RDS导入前提
- 目标数据库用户名必须与源数据库用户名保持一致
- 解决方法
- 使用sed命令将sql文件中的源数据库用户名替换成目标数据库的用户名
- sed -i 's#源数据库用户#目标数据库用户#g' a.sql
mysql -h 数据库地址 -u 用户名 -p 密码 < a.sql
参考文档:
- https://aws.amazon.com/cn/premiumsupport/knowledge-center/mysqldump-error-rds-mysql-mariadb/
- https://aws.amazon.com/cn/premiumsupport/knowledge-center/error-1227-mysqldump/
- https://aws.amazon.com/cn/premiumsupport/knowledge-center/definer-error-mysqldump/
- https://console.aws.amazon.com/support/home?region=ap-southeast-1#/case/?displayId=7015184741&language=en