MySQL / Amazon RDS错误:“你没有超级特权......”

时间:2012-07-22 15:49:45

标签: mysql amazon-ec2 amazon-web-services amazon-rds grant

我正在尝试将我的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初学者,很抱歉这么简单的问题。想法?

8 个答案:

答案 0 :(得分:96)

  1. 打开RDS Web控制台。
  2. 打开“参数组”标签。
  3. 创建一个新的参数组。在对话框中,选择与MySQL数据库版本兼容的MySQL系列,为其命名并确认。 选择刚刚创建的参数组并发出“编辑参数”。
  4. 查找参数'log_bin_trust_function_creators'并将其值设置为'1'。
  5. 保存更改。
  6. 打开“实例”标签。展开您的MySQL实例并发出名为“Modify”的“Instance Action”。
  7. 选择刚创建的参数组并启用“立即应用”。
  8. 点击“继续”并确认更改。
  9. 等待&#34;修改&#34;操作完成。
  10. 再次打开“实例”标签。展开您的MySQL实例并展开“Instance Action”选项卡,然后选择&#34; Reboot&#34;。

答案 1 :(得分:48)

http://getasysadmin.com/2011/06/amazon-rds-super-privileges/,您需要在AWS console中将log_bin_trust_function_creators设置为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将报告错误,但会继续处理转储文件的其余部分。

答案 2 :(得分:27)

转储文件中触发器和存储过程的问题在于这些定义包括应由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

答案 3 :(得分:5)

根据AWS文档中的定义,默认情况下会禁用触发器,过程和函数,因为默认情况下启用了二进制日志记录。禁用基本上使您的数据库更安全,但如果您通过网络正确保护它将无关紧要。

按照以下步骤操作,您的问题将得到解决 https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

此外,在创建过程时不应使用定义器。一个简单的sed命令可以删除它。

答案 4 :(得分:4)

除了编辑

  

log_bin_trust_function_creators = 1

您需要从转储文件中删除所有 DEFINER ,请查看以下链接,了解 SED 命令可以帮助清理你的sql转储文件。

https://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/#comment-10968243

答案 5 :(得分:0)

对我来说,我的转储文件中只有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命令中,然后可以成功导入生成的转储文件。

答案 6 :(得分:0)

使用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%

我不知道为什么,但是这个技巧对我有用。 一个简单的文本编辑器就足以做到这一点。

答案 7 :(得分:0)

要完成@arun-r 的 answer,创建新参数组时需要重新启动。

enter image description here