繁体   English   中英

MySQL/Amazon RDS 错误:“您没有超级权限...”

[英]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

然后我尝试将 this.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 初学者,很抱歉回答这么简单的问题。 想法?

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

不需要重启,因为log_bin_trust_function_creatorsapply type = dynamic 如果你的 RDS 已经有一个附加的参数组并且你编辑它,而不是创建一个新的参数组,至少这是正确的。 只需保存参数编辑即可。

根据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

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

log_bin_trust_function_creators = 1

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

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

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

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

除了编辑

log_bin_trust_function_creators = 1

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

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

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

在此处输入图像描述

使用arun -r answer后,如果问题没有解决则需要修改你的dump文件。 很简单。

在转储文件中,您会找到类似以下的行:

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%

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

AWS/RDS中设置参数的正确方法是创建参数组,就像此处提到的其他响应一样。

对于这种特殊情况,在创建新参数组时,在参数部分将变量log_bin_trust_function_creators设置为1

修改您的数据库,然后 select 您的新参数组位于Additional configuration部分下的DB parameter group

尽管我启用了Apply Immediately ,但它对我不起作用(MySQL v8)。 重启后就成功了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM