首次尝试将EC2 MySQL迁移到Amazon RDS进行得不顺利-SUPER特权


11

我一直在尝试将现有数据库从在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更改为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。没问题,只需注释掉该行,并希望以后通过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。第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` */;

通过注释掉前两行,并在第三行中添加“ CREATE”,我可以跳过这一行。但也有这样的部分。没有进行所有编辑,有办法解决这个问题吗?是否mysqldump希望不产生任何需要SUPER特权的选项?

似乎很多人都遇到过类似的问题,例如必须sed针对mysqldump / mysqlbinlog的输出运行!我也将在AWS论坛上发布-确实,我认为RDS应该具有从mysqldump导入的更宽容的方式,或者可以对现有数据库运行以创建带有RDS安全性的转储的特定工具。只是想知道是否有人有其他食谱或技巧可能对您有所帮助。

谢谢,

戴夫


对不起-忘了说了,我已经试图改变log_bin_trust_function_creators参数设置为1,但仍然得到了同样的错误,在线路7844.
DSL101

旧帖子,但是您可以避免说出第一个错误--masterdata=2。然后,该行将在转储中被注释掉。
Halfgaar 2015年

Answers:


26

log_bin_trust_function_creators在RDS上,您可能确实需要= 1,但这不是问题,在这里。

DEFINER 只有拥有SUPER 特权,您才能指定  自己账户以外的其他值  。

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

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

因此,如果非SUPER用户可以使用任意定义程序创建过程,那将是一个严重的漏洞,因为用户可以随意提升其权限。

当然,当使用定义者安全性上下文时,对于视图也是如此,如您发布的示例中所示。

我对RDS的最大抱怨之一就是您无法拥有SUPER...现在它也可以成为您的一个:),因为事实是造成您遇到问题的原因。

当然,如果我正在运行托管的MySQL服务,那么我也不会给任何人SUPER任何帮助,所以即使有时它很笨拙,他们的安全模型还是有道理的。

如果所有对象都具有相同的定义器,则一种解决方法是使用该帐户而不是您现在使用的帐户来还原转储,但这似乎不太可能。

如果仅在DEFINER声明中删除一行,则应该使转储文件在单独出现在一行中的情况下起作用,或者您可以使用sed或perl来修改文件...这个想法我已经知道您不喜欢,但是,对于MySQL来说,这样的黑客行为是完全合法的,这确实是一件好事,即使在非RDS环境中,也离我作为DBA要做的事情并不遥远。

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

...可能不是您所希望的答案,但是您可以针对您的转储文件运行该文件,并最终得到一个稍微可用的文件。


非常感谢您的全面答复,并确认我对sed / perl是唯一解决方案的看法。我正在使用的应用程序是高度定制的Joomla,尽管是开源程序,但我没有时间/技能对其进行分析以弄清楚是否可以很好地过渡到RDS。我的想法是“尝试一下然后看”-但似乎第一步是最困难的-很大程度上是由于Amazon的迁移工具不足(在我看来)。我同意安全模型,但是如果mysqldump的默认输出产生了很多问题,为什么它们没有更好的解决方案?我也会问他们这个。
dsl101

1
真棒。非常感谢您的Perl脚本。我的备份是4 GB以上,而打开它是一个挑战。这挽救了我的一天。
Emile Baizel 2014年

1
很好的解释,很好的答案,很好的解决方案!愚蠢的定义器。
rkaregaran 2014年

4
非常感谢您的perl one班轮。这是我能够找到的唯一有效的方法。这些委员会上的许多其他公司根本没有这样做。如果可以的话,我会再次投票。
lucian303

1

在我的情况下,转储中的“ CHANGE MASTER TO MASTER_LOG_FILE = ...”行给了我错误。该行是由mysqldump的“ --master-data”选项添加的。在Amazon AWS中,您需要通过使用“ mysql.rds_set_external_master”过程设置主详细信息来开始复制,而不是在此处阅读

因此,我只是记下该行“ head 22 backup.dump”的注释,其中第22行报告了错误。然后在导入之前将其删除,对于我的大文件,我使用:“ sed'22d'backup.dump> backup_clean.dump”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.