首先尝试将EC2 MySQL迁移到Amazon RDS并不好 – SUPER特权

我一直在尝试将在EC2上运行的MySQL中的现有数据库移动到新的Amazon RDS实例(一个实验,以查看是否可以移动)。 到目前为止,这不太好。 在设置复制之前,我在最初的导入中停留了(说明在这里 )。

我已经准备好了RDS实例,并可以使用mysql从EC2实例连接到它。 我运行mysqldump命令如下:

mysqldump --master-data --databases db1 db2 > dump.sql

然后尝试将其上传到RDS:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

第一个问题是在转储的第22行:

更改MASTER_LOG_FILE ='mysql-bin.000002',MASTER_LOG_POS = 106;

此行导致ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 。 没问题,刚刚注释掉了这行,希望稍后通过mysql.rds_set_external_master()修复它。 重新上传,并得到了一个非常类似的错误: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 。 线7844周围的部分如下所示:

 /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */ /*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */; 

通过评论前两行并在第三行添加“创build”,我能够通过这一行。 但是有很多这样的部分。 没有所有的编辑有没有方法吗? 像mysqldump的选项不会产生任何需要超级权限的东西?

好像很多人都有类似的问题,比如不得不对mysqldump / mysqlbinlog的输出运行sed ! 我也将在AWS论坛上发布 – 真的,我认为RDS应该有一个更加宽容的从mysqldump导入的方式,或者是一个可以在现有的db上运行的特定的工具来创build一个RDS安全性的转储。 只是想知道有没有其他的食谱或技巧可以帮助这里。

谢谢,

戴夫

您可能需要在RDS上使用log_bin_trust_function_creators = 1,但这不是问题。

只有拥有SUPER权限,才能指定DEFINER值而不是自己的帐户。

http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

当存储的程序(proc,函数,事件或触发器)正在运行时,它所做的一切都有定义它的用户的权限,或者用DEFINER声明明确声明的用户的权限。 这允许存储的程序允许其他用户对他们没有直接权限操作的数据进行操作,只要他们有权使用存储的程序本身即可。

这将是一个严重的漏洞,那么,如果一个非SUPER用户可以创build一个任意定义的程序,因为用户可以随意升级他或她的权限。

当然,当使用定义的安全上下文时,这也是正确的,就像你发布的例子那样。

我对RDS最大的抱怨之一是你不能拥有SUPER ,而现在它也可以成为你的一员,因为这个事实是你遇到的问题的原因。

当然,如果我运行一个托pipe的MySQL服务,我也不会给任何人SUPER ,所以他们的安全模型是有道理的,即使它有时是笨拙的。

如果您的所有对象都有相同的定义者,则解决方法是使用该帐户而不是您现在使用的帐户来恢复转储,但似乎不太可能。

DEFINER声明删除行应该使转储文件在单独出现在一行的情况下工作,或者你可以使用sed或perl来修改文件…我已经知道你不喜欢的想法,但是对于MySQL来说,这真是一件好事,这种骇人听闻是相当合理的,即使在非RDS环境中,也不像我作为DBA要做的事情那么遥远。

 perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql 

…可能不是你所希望的答案,但是你可以运行这个对你的转储文件,并应该得到一个稍微更有用的文件。

在我的情况是“CHANGE MASTER TO MASTER_LOG_FILE = …”行在转储给我的错误。 这一行是由mysqldump的“–master-data”选项添加的。 在Amazon AWS中,您需要通过使用“mysql.rds_set_external_master”过程来设置主节点来启动复制,而不是在此处阅读

所以我只需要在那行22“backup.dump”的那一行中logging这个错误。 然后在导入之前将其删除,对于我使用的大文件:“sed'22d'backup.dump> backup_clean.dump”