【问题标题】:MySQL/Amazon RDS error: "you do not have SUPER privileges..."MySQL/Amazon RDS 错误:“您没有超级权限...”
【发布时间】:2012-07-21 01:10:37
【问题描述】:

我正在尝试将我的 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 &gt; FLUSH privileges; 也不起作用。

我是一个 mysql 初学者,很抱歉这么简单的问题。想法?

【问题讨论】:

  • 您不能在 RDS 上GRANT SUPER。 RDS 无法获得 SUPER 特权。
  • 使用相同的 MySQL 用户名创建和恢复转储(用于连接和转储中的 DEFINER 关键字)。更改 log_bin_trust_function_creators 不是理想的解决方案。最糟糕的是在这种情况下使用 -f 参数
  • 在我的情况下,我的 sql 文件有 CREATE FUNCTION 需要特权用户的语句。 see this

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


【解决方案1】:
  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 实例并展开“Instance Action”选项卡并选择“Reboot”。

2020 年 12 月编辑:不需要重新启动,因为 log_bin_trust_function_creators 的应用类型 = 动态。如果您的 RDS 已经有一个附加的参数组并且您对其进行编辑,而不是创建一个新的参数组,那么至少这是正确的。只需保存参数编辑即可。

【讨论】:

  • > 第 9 点做什么...您调整实例以使用之前定义的参数组。有关更多详细信息,请参阅 Daniel Ferbers 的这篇原始博客文章:techtavern.wordpress.com/2013/06/17/…
  • 这会停止 RDS Mysql 复制吗?
  • 嗨@arun-r,我完成了您解释的步骤,但参数'log_bin_trust_function_creators'不可用以防万一。我认为最新的 AWS RDS 发生了一些变化。你能帮我吗,我现在该怎么做?谢谢,
  • @RamratanGupta 它不会停止
  • @arun-r 感谢您的回复。我解决了我的问题。实际上我在列表中找到了 log_bin_trust_function_creators。但我的问题已通过联系 AWS 支持解决
【解决方案2】:

根据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 将报告错误,但会继续处理转储文件的剩余部分。

【讨论】:

  • 嗨@Ross,谢谢。不幸的是,使用-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]
  • 这是我的命令,它给了我上述错误:./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx" 我知道它必须是引号或双破折号问题,但到目前为止这些类型的更改都没有工作,呃!
  • -f 选项不会使错误消失,它只会允许处理文件中的非违规 SQL 语句。从我读到的内容来看,RDS 对转储文件中的存储过程感到窒息。尝试创建一个没有存储过程的转储文件,看看是否加载正常:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
  • -@Ross,太棒了,我的数据库在那里,哇,这是一个烦人的问题,感觉 AWS 应该对此做点什么。
  • 至少我可以使用-f 选项加载所有数据。第二阶段可能是单独转储例程/stred proc等
【解决方案3】:

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

【讨论】:

  • 清理定义器也可以用 sed 来完成: sed -i 's/DEFINER=OldDefiner@localhost/DEFINER=NewDefiner@localhost/g' ./TargetSqlFile。 sql
【解决方案4】:

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

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

【讨论】:

  • 是的,就是这样。我的转储文件相对较小,因此我从中删除了所有出现的这 2 个命令。
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

    除了编辑

    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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 2021-02-03
          • 2015-01-07
          • 2011-12-25
          • 1970-01-01
          相关资源
          最近更新 更多