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

tim*_*son 82 mysql grant amazon-ec2 amazon-web-services amazon-rds

我正在尝试将我的mysql数据库从Amazon EC2复制到RDS:

我成功地使用以下方法mysqldump将我的数据库添加到我的根文件夹中:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql
Run Code Online (Sandbox Code Playgroud)

然后我尝试将此.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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我收到以下错误消息:

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)
Run Code Online (Sandbox Code Playgroud)

我尝试过GRANT SUPER..多种方式,但是当我尝试这样做时,我也遇到了错误.打字mysql > FLUSH privileges;也不起作用.

我是一个mysql初学者,很抱歉这么简单的问题.思考?

aru*_*n-r 110

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

  • 当我创建一个新的参数组并进行测试时,它不起作用。重启后我就工作了。 (4认同)

Ros*_* II 55

根据http://getasysadmin.com/2011/06/amazon-rds-super-privileges/,您需要log_bin_trust_function_creators在AWS控制台中设置为1 ,以便无误地加载转储文件.

如果要忽略这些错误,并加载转储文件的其余部分,可以使用以下-f选项:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql
Run Code Online (Sandbox Code Playgroud)

该-f会报告错误,但会继续处理转储文件的剩余部分.

  • `-f`选项不会使错误消失,它只会允许处理文件中的非违规SQL语句.从我读过的内容来看,RDS正在扼杀转储文件中的存储过程.尝试创建一个没有存储过程的转储文件,看看是否加载正常:`mysqldump --routines = 0 --triggers = 0 --events = 0 my_database -u my_username -p` (4认同)
  • -@Ross,太棒了,我的数据库在那里,哇,这是一个烦人的问题,感觉 AWS 应该对此做点什么。 (2认同)

小智 30

转储文件中触发器和存储过程的问题在于这些定义包括应由DEFINER创建存储过程的用户.用户很可能在RDS中不存在,因此会引发错误.为了能够加载转储文件,您可以使用sed或Perl删除DEFINER,并与正在执行导入的用户一起创建存储过程/触发器.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql
Run Code Online (Sandbox Code Playgroud)

现在您应该能够加载固定的转储文件

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql
Run Code Online (Sandbox Code Playgroud)

如前面的回答所述,您应该设置数据库参数:

log_bin_trust_function_creators = 1
Run Code Online (Sandbox Code Playgroud)


Yep*_*_Me 24

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

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

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

然后看man mysqldump:

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

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


Jos*_*ock 5

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

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

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


Jub*_*ail 5

除了编辑

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