我一直在尝试将现有数据库从运行在 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
不生产任何需要超级特权的东西的选项?
似乎很多人都遇到过类似的问题,比如不得不sed
针对 mysqldump / mysqlbinlog 的输出运行!我也将在 AWS 论坛上发帖——我真的认为 RDS 应该有一种更宽容的从 mysqldump 导入的方式,或者可以针对现有数据库运行的特定工具来创建一个与 RDS 安全性有关的转储。只是想知道是否有人有其他可能对这里有所帮助的食谱或技巧。
谢谢,
戴夫
您确实可能需要
log_bin_trust_function_creators
在 RDS 上设置 = 1,但这不是问题所在。当一个存储程序(proc、函数、事件或触发器)运行时,它所做的一切都具有定义它的用户的权限,或者使用声明明确声明的用户的权限
DEFINER
。除其他外,这允许存储程序允许其他用户对他们没有直接操作权限的数据执行操作,只要他们有权使用存储程序本身。SUPER
那么,如果非用户可以使用任意定义器创建过程,这将是一个严重的漏洞,因为用户可以随意提升他或她的权限。当然,当使用定义器安全上下文时,视图也是如此,如您发布的示例中所示。
我对 RDS 的最大抱怨之一是你不能拥有
SUPER
......现在它也可以成为你的一个 :) 因为这个事实是你遇到问题的原因。当然,如果我运行的是托管 MySQL 服务,我也不会给任何人
SUPER
,所以他们的安全模型是有意义的,即使它有时很笨拙。如果您的所有对象都具有相同的定义器,则一种解决方法是使用该帐户而不是您现在使用的帐户来恢复转储,但这似乎不太可能。
仅删除带有
DEFINER
声明的行应该使转储文件在它单独出现在一行上的情况下工作,或者您可以使用 sed 或 perl 修改文件...我已经知道您不喜欢的想法,但是,对于 MySQL 来说,这样的黑客行为是相当合法的,这确实是一件好事,而且与我作为 DBA 必须做的事情相距甚远,即使在非 RDS 环境中也是如此。...可能不是您希望的答案,但您可以针对您的转储文件运行它,并最终得到一个更可用的文件。
就我而言,转储中的“CHANGE MASTER TO MASTER_LOG_FILE= ...”行给了我错误。此行是由 mysqldump 的“--master-data”选项添加的。在 Amazon AWS 中,您需要通过使用“mysql.rds_set_external_master”过程设置主详细信息来开始复制,而不是在此处阅读
所以我只是记下了第 22 行在错误中报告的“head 22 backup.dump”行。然后在导入之前将其删除,对于我使用的大文件:“sed '22d' backup.dump > backup_clean.dump”