MySQL / Amazon RDS错误:“您没有SUPER特权…”


98

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


9
您不能GRANT SUPER使用RDS。RDS无法获得SUPER特权。
ceejayoz

使用相同的MySQL用户名创建转储并恢复转储(对于转储中的连接和DEFINER关键字)。更改log_bin_trust_function_creators不是理想的解决方案。最糟糕的是在这种情况下使用-f参数
ad4s

就我而言,我的sql文件具有CREATE FUNCTION需要特权用户的语句。看到这个
会计师م18年

Answers:


63

根据http://getasysadmin.com/2011/06/amazon-rds-super-privileges/,您需要log_bin_trust_function_creatorsAWS控制台中设置为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会报告错误,但会继续处理转储文件的剩余部分。


嗨@罗斯,谢谢你。不幸的是,使用-f没有帮助。我遇到了同样的错误。使用您的链接,我在使用RDS Cli工具语法时遇到了麻烦。意思是,当我去更改特权时,出现以下错误:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson 2012年

这是给我上述错误的命令:./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"我知道这一定是引号或双破折号问题,但是到目前为止,这些类型的更改都没有起作用!
蒂姆·彼得森

4
-f选项不会使错误消失,它只会允许处理文件中不违规的SQL语句。据我了解,RDS阻塞了转储文件中的存储过程。尝试创建没有存储过程的转储文件,看看加载是否正常:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II

2
-@ Ross,非常有用,我的数据库在那里,哇,这是一个令人讨厌的问题,感觉AWS应该为此做些事情。
蒂姆·彼得森

至少我可以使用该-f选项加载所有数据。第二阶段可能是仅转储例程/ stred proc等,等等
Kaymaz

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

>第9点的作用是什么……您可以调整实例以使用先前定义的参数组。有关更多详细信息,请参阅Daniel Ferbers的原始博客文章: techtavern.wordpress.com/2013/06/17/…–
AndrewL

这会停止RDS Mysql复制吗?
Ramratan Gupta

嗨@arun -r,我按照您解释的步骤进行操作,但是如果使用'log_bin_trust_function_creators'参数则不可用。我认为最新的AWS RDS中有所更改。您能帮我现在如何做?谢谢,
爬完开发商

@RamratanGupta它不会停止
arun-r

1
@ arun-r谢谢您的回复。我解决了我的问题。实际上,我在列表中找到了log_bin_trust_function_creators。但是我可以通过联系AWS支持解决问题
Pawan Developers

33

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

1
清理定义者也可以使用sed完成:sed -i's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g'./TargetSqlFile.sql
Siliconrockstar

16

对我来说,我的转储文件中只有2个命令需要SUPER特权:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

根据mysqldump文档,您可以使用禁用它们--set-gtid-purged=OFF

然后看着man mysqldump

如果打算仅使用转储服务器中的某些数据来部署新的复制从属服务器,则使用ON。如果要通过在拓扑中复制表来修复表,请使用OFF。如果要在不相交的复制拓扑之间复制表并将保留该表,请使用OFF。

因此,我决定添加--set-gtid-purged=OFFmysqldump命令中,然后可以成功导入生成的转储文件。


1
是的,就是这样。我的转储文件相对较小,因此我从中删除了所有这2条命令。
Zolbayar

6

根据AWS文档中的定义,默认情况下禁用触发器,过程和功能,因为默认情况下启用了二进制日志记录。禁用基本上可以使您的数据库更安全,但是,如果您通过网络进行了适当的保护,那就没关系了。

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

同样,在创建过程时不应使用定义器。一个简单的sed命令可以将其删除。



1

使用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 using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.