ERROR 1465"无法在系统表上创建触发器"从mysqldump创建的SQL恢复后

时间:2014-12-08 14:56:11

标签: mysql mysqldump rds

我在亚马逊RDS上运行mysql 5.6服务器,并设置了一个用于使用mysqldump创建备份的只读副本。

我尝试使用" - 所有数据库"选项,但是当我尝试导入mysqldump创建的SQL时,我最终会从mysql命令客户端发出此错误:

ERROR 1465 "Triggers can not be created on system tables"

我用过" - 所有数据库"因为我基本上想要在崩溃的情况下恢复RDS中的所有内容。

也许这是错的,我应该只选择我的模式(加上mysql.users表)?但是什么是" - 所有数据库"首先,如果它永远不会工作?或者我使用它错了吗?

2 个答案:

答案 0 :(得分:5)

经过与亚马逊支持的更长时间的对话,这就是我想出来的:

  1. 触发问题可以通过临时将mysql配置设置log_bin_trust_function_creators设置为1来解决

  2. 他们不建议拍摄完整的快照,而是选择单个数据库。

  3. 这意味着您必须在恢复中执行两个步骤:

    1. 创建架构
    2. 创建用户并授予他们必要的权利
    3. 导入转储数据
  4. 对于视图,您可能会遇到错误消息

    错误1227(42000)在第xxx行:拒绝访问;您需要(至少一个)此操作的SUPER权限

    显示的是因为mysqldump在创建视图中创建了一个definer语句(甚至你的root用户也没有足够的权限来设置它)。正如here所述,摆脱它们的唯一方法是过滤,我喜欢这样:

    sed -i' s / ^ / .. 50013 DEFINER =。* SQL SECURITY DEFINER .. $ / - 删除安全定义者声明/ g'

  5. 令人尴尬,需要做大量的手工工作才能从RDS中获取数据库备份,并且还要重新进入。在任何情况下都应该依赖关于仅由RDS自动生成的备份,因为可以通过访问您的AWS账户的恶意攻击者轻松删除这些备份。

答案 1 :(得分:3)

导入mysql -f以跳过违规行为。

在我的情况下,跳过的定义是这个小宝石:

DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`rdsadmin`@`localhost`*/ /*!50003 trigger block_proc_u before update on proc
for each row
BEGIN
DECLARE foo varchar(255);
if old.Definer = "rdsadmin@localhost" then
  select `ERROR (RDS): CANNOT MODIFY RDSDMIN OBJECT` into foo;
end if;
END */;;

另外还有四个非常相似的(总共五个跳过)。