Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个触发器的mysqldump_Mysql_Mysqldump - Fatal编程技术网

具有多个触发器的mysqldump

具有多个触发器的mysqldump,mysql,mysqldump,Mysql,Mysqldump,我正在使用mysqldump创建备份并将其恢复到另一台服务器上 我在这个数据库上经常使用的特性之一是触发器。如果数据库上的任何一个操作都有多个触发器,则恢复可能会失败,因为该对象(第二个触发器)依赖于尚未创建的对象 原因似乎是两个触发器声明都包含对彼此的引用。但由于它们是按顺序执行的,第一个就失败了 CREATE TRIGGER trigger_one ... PRECEDES trigger_two ...; [and then a bit further down] CREATE TRI

我正在使用mysqldump创建备份并将其恢复到另一台服务器上

我在这个数据库上经常使用的特性之一是触发器。如果数据库上的任何一个操作都有多个触发器,则恢复可能会失败,因为该对象(第二个触发器)依赖于尚未创建的对象

原因似乎是两个触发器声明都包含对彼此的引用。但由于它们是按顺序执行的,第一个就失败了

CREATE TRIGGER trigger_one
...
PRECEDES trigger_two
...;

[and then a bit further down]

CREATE TRIGGER trigger_two
...
FOLLOWS trigger_one
...;

在Percona博客上,我将数据和结构分离,并将结构分离为“仅触发器”和“除此之外的所有内容”,但问题仍然存在,我希望能够自动备份和复制。

我无法重现这个问题

我不太清楚Percona文章中提到的MySQL版本,但我怀疑这是5.7(或至少是5.7.2)

测试:

mysql>选择版本();
+-----------+
|版本(|
+-----------+
| 5.7.13    |
+-----------+
一行一组(0.00秒)
mysql>创建表'mytable'('mycl'BOOL);
查询正常,0行受影响(0.00秒)
mysql>在“mytable”上插入之前创建触发器“TRIGGER_one”`
->每行
->设置为新。`mycol`:=1;
查询正常,0行受影响(0.00秒)
mysql>在“mytable”上插入之前创建触发器“TRIGGER_two”`
->每行的“触发器”前面都有一个`
->设置为新。`mycol`:=2;
查询正常,0行受影响(0.00秒)
$mysqldump mydatabase>dump.sql
--
--表“mytable”的表结构`
--
如果存在“mytable”,则删除表;
/*!40101 SET@saved_cs_client=@@character_SET_client*/;
/*!40101设置字符集客户端=utf8*/;
创建表“mytable”(
`mycol`tinyint(1)默认为空
)ENGINE=InnoDB默认字符集=utf8;
/*!40101 SET character_SET_client=@saved_cs_client*/;
...
分隔符;;
/*!50003创建*/*!50017 DEFINER=`testuser`@`testmachine`*/
/*!50003在“mytable”上插入之前触发“TRIGGER_two”`
对于每一行,设置为新的。`mycl`:=2*/;;
定界符;
...
分隔符;;
/*!50003创建*/*!50017 DEFINER=`testuser`@`testmachine`*/
/*!50003在'mytable'上插入之前触发'TRIGGER_one'`
每行
设置为新。`mycol`:=1*/;;
定界符;
...

。。。若要影响触发器顺序,请为每个 指示现有触发器的后面或前面以及名称 也有相同的触发事件和动作时间


每台服务器上使用的MySQL版本是什么?。你能在两台服务器上都显示错误消息吗?.5.7.13。Percona引用的是5.5。我完全可以做你正在做的事。我遇到的问题是,当我运行
mysqldump--no create info--skip triggers sakila>data.sql
两个触发器定义中的第一个包含
在trigger\u one
之前,我通过MySQL workbench运行它,但会尝试使用命令行,我认为命令行基本相同。@Hans:谢谢您的指点MySQL版本的文章。文档中说:
mysqldump按激活顺序转储触发器,这样在重新加载转储文件时,触发器将按相同的激活顺序创建。
,这就是为什么我不能确定问题出在哪里。是的,我看到了,但在我的输出中,每个触发器都包含完整的preced/follows语法,这意味着有一个循环引用。它在导入时失败。我甚至使用了“在一个事务中”选项。@Hans:我无法获取
mysqldump
生成带有
后面
前面
或两者的输出。请参阅。我知道它们是可选配置的,但在开始恢复备份之前我已经配置了它们,所以现在我要删除它们,让默认的执行顺序接管。谢谢