MySQL/Amazon RDS error: "you do not have SUPER privileges..."

我试图将 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 初学者,很抱歉问了这么简单的问题,有什么想法吗?

126249 次浏览

根据 http://getasysadmin.com/2011/06/amazon-rds-super-privileges/,需要在 AWS 控制台中将 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将报告错误,但是将继续处理转储文件的其余部分。

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

正如前面的答案所说,您应该设置 DB 参数:

log_bin_trust_function_creators = 1
  1. Open the RDS web console.
  2. 打开“参数组”选项卡。
  3. 创建新的参数组。在对话框中,选择与您的 MySQL 数据库版本兼容的 MySQL 系列,给它一个名称并确认。 选择刚刚创建的“参数组”并发出“编辑参数”。
  4. 查找参数 log_bin_trust_function_creators并将其值设置为 1
  5. Save the changes.
  6. 打开“实例”选项卡,展开 MySQL 实例并发出名为“修改”的“实例操作”。
  7. 选择刚刚创建的“参数组”并启用“立即应用”。
  8. 单击“继续”并确认更改。
  9. 等待“修改”操作完成。
  10. 再次打开“ Instances”选项卡,展开 MySQL 实例并展开“ Instance Action”选项卡并选择“ Reboot”。

由于 log_bin_trust_function_creators具有 apply type = dynamic,因此不需要重新引导 。如果您的 RDS 已经有一个附加的参数组并且您编辑它,而不是创建一个新的参数组,那么至少这是正确的。只要保存参数编辑,就可以开始了。

正如 AWS 文档中定义的那样,默认情况下禁用触发器、过程和函数,因为默认情况下启用了二进制日志记录。禁用基本上使您的数据库更加安全,但是如果您已经通过网络进行了适当的安全保护,那就无关紧要了。

按照这些步骤,你的问题就会得到解决 Https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

另外,在创建过程时不应该使用定义器。

除了编辑

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

For me, there was only 2 commands in my dump file which required SUPER privileges:

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

According to the mysqldump docs you can disable these with --set-gtid-purged=OFF.

然后看看 Man mysqldump:

如果意图仅使用来自转储服务器的部分数据部署新的复制从属服务器,则使用 ON。如果目的是通过在拓扑中复制表来修复表,则使用 OFF。如果目的是在不相交且将保持不相交的复制拓扑之间复制表,则使用 OFF。

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

在使用 arun-r 答案之后,如果问题没有得到解决,您需要修改您的转储文件。

在转储文件中,您将看到如下行:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

你必须更换:

  • 通过你的用户名在 rds 数据库 username_from_dumped_database
  • host_from_dumped_databse by %

I don't know why but this trick worked for me. 一个简单的文本编辑器就足以做到这一点。

要完成@arun-r 的 回答,在创建新参数组时需要重新引导。

enter image description here