【问题标题】:ERROR 1465 "Triggers can not be created on system tables" after restore from SQL created by mysqldump从 mysqldump 创建的 SQL 还原后出现错误 1465“无法在系统表上创建触发器”
【发布时间】:2014-12-08 14:56:11
【问题描述】:

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

我尝试使用“--all-databases”选项,但是当我尝试导入由 mysqldump 创建的 SQL 时,我最终从 mysql 命令客户端收到此错误:

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

我使用“--all-databases”是因为我基本上想恢复 RDS 中的所有内容,以防发生崩溃。

也许这是错误的,我应该只选择我的模式(加上 mysql.users 表)?但是,如果“--all-databases”永远不会起作用,那么它首先是什么?还是我用错了?

【问题讨论】:

    标签: mysql mysqldump rds


    【解决方案1】:

    在与亚马逊支持人员进行了较长时间的交谈后,我得出了以下结论:

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

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

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

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

      第 xxx 行的错误 1227 (42000):访问被拒绝;您需要(至少一个)超级权限才能执行此操作

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

      sed -i 's/^/..50013 DEFINER=.* SQL SECURITY DEFINER ..$/-- 删除了安全定义语句/g'

    尴尬要从 RDS 中获取数据库备份并重新导入需要大量手动工作。在任何情况下您都应该依赖备份仅由 RDS 自动生成,因为获得 AWS 账户访问权限的恶意攻击者可以轻松删除这些内容。

    【讨论】:

    • 接受您自己的答案。 :)
    • 哈哈 没想到 ;-)
    • 当您说“mysql 配置设置”时,您是指 my.cnf 文件吗?
    • 由于我想将数据导入回 RDS 实例(我们尝试了最坏情况的恢复),我指的是 AWS 控制台中 mysql 的配置设置(因为您无法编辑 my. cnf 直接在他们的 RDS 实例上),但是是的,我假设这只是 1:1 映射到 my.cnf
    【解决方案2】:

    使用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 */;;
    

    加上另外四个非常相似的(共跳过五个)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多