我正在尝试将MySQL数据库从Amazon EC2复制到RDS:
我使用以下命令成功地将数据库的mysqldump
放入根文件夹中:
root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql
然后我试图将此.sql文件传输到新的RDS数据库:
root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql
不幸的是,我收到以下错误消息:
You do not have the SUPER privilege and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators variable)
我尝试了多种方式GRANT SUPER..
,但是当我尝试这样做时也会遇到错误。键入mysql > FLUSH privileges;
也不起作用。
我是mysql的初学者,很抱歉遇到这样一个简单的问题。有想法吗?
每http://getasysadmin.com/2011/06/amazon-rds-super-privileges/,您需要将log_bin_trust_function_creators
中的AWS console设置为1,才能正确加载转储文件。
如果要忽略这些错误,并加载其余的转储文件,则可以使用-f
选项:
mysql -f my_database -u my_username -p -h
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql
-f
将报告错误,但将继续处理转储文件的其余部分。
转储文件中触发器和存储过程的问题是,这些定义包括应由DEFINER创建存储过程的用户。用户很可能不存在于RDS中,因此会引发错误。为了能够加载转储文件,您可以使用sed或Perl删除DEFINER并与执行导入的用户一起创建存储过程/触发器。
perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql
现在您应该能够加载固定的转储文件
mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql
如先前答案中所述,您应该设置数据库参数:
log_bin_trust_function_creators = 1
对我来说,我的转储文件中只有2个命令需要SUPER特权:
SET @@GLOBAL.gtid_purged
SET @@SESSION.SQL_LOG_BIN
根据mysqldump docs,您可以使用--set-gtid-purged=OFF
禁用它们。
然后看着man mysqldump:
如果要仅使用转储服务器中的某些数据来部署新的复制从属,请使用ON。如果要通过在拓扑中复制表来修复表,请使用OFF。如果要在不相交的复制拓扑之间复制表,请保持OFF。
因此,我决定将--set-gtid-purged=OFF
添加到我的mysqldump
命令中,然后我就可以成功导入生成的转储文件。
AWS文档中定义的触发器,过程和功能默认情况下处于禁用状态,因为默认情况下启用了二进制日志记录。禁用基本上可以使您的数据库更安全,但是,如果您通过网络进行了适当的保护,那就没关系了。
按照以下步骤操作,您的问题将得到解决。https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/
此外,在创建过程时,您不应使用定义器。一个简单的sed命令可以将其删除。
除了编辑
log_bin_trust_function_creators = 1
您需要从转储文件中删除所有DEFINER,请检查以下链接以获取SED命令,该命令可以帮助清除sql转储文件。
使用arun -r答案后,如果问题仍未解决,则需要修改转储文件。很简单。
在转储文件中,您会发现类似以下行:
DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN
您必须替换:
username_from_dumped_database
通过您在rds数据库上的用户名。host_from_dumped_databse
by %
] >>我不知道为什么,但是这个技巧对我有用。一个简单的文本编辑器就足以做到这一点。