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

Ber*_*ard 4 mysql mysqldump rds

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

我尝试使用"--all-databases"选项,但是当我尝试导入mysqldump创建的SQL时,我最终得到了mysql命令客户端的错误:

ERROR 1465 "Triggers can not be created on system tables"
Run Code Online (Sandbox Code Playgroud)

我使用了"--all-databases",因为我基本上想要恢复RDS中的所有内容,就像以前发生崩溃一样.

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

Ber*_*ard 5

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

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

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

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

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

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

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

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

这是令人尴尬的,有让数据库备份出来的RDS需要这么多的体力劳动,而且还回去.在任何情况下,你应该依靠其自动RDS只作了备份,因为这些可能会被恶意攻击者可以很容易地删除获得了对您的AWS账户的访问权限.


Ale*_*x R 5

导入 withmysql -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 */;;
Run Code Online (Sandbox Code Playgroud)

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