具有多个触发器的 mysqldump

标签 mysql

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

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

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

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

[and then a bit further down]

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

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

最佳答案

我无法重现问题。

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

测试:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.13    |
+-----------+
1 row in set (0.00 sec)

mysql> CREATE TABLE `mytable` (`mycol` BOOL);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TRIGGER `trigger_one` BEFORE INSERT ON `mytable`
    -> FOR EACH ROW
    ->   SET NEW.`mycol` := 1;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TRIGGER `trigger_two` BEFORE INSERT ON `mytable`
    -> FOR EACH ROW PRECEDES `trigger_one`
    ->   SET NEW.`mycol` := 2;
Query OK, 0 rows affected (0.00 sec)
$ mysqldump mydatabase > dump.sql
--
-- Table structure for table `mytable`
--

DROP TABLE IF EXISTS `mytable`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `mytable` (
  `mycol` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

...

DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`testuser`@`testmachine`*/ 
/*!50003 TRIGGER `trigger_two` BEFORE INSERT ON `mytable`
FOR EACH ROW SET NEW.`mycol` := 2 */;;
DELIMITER ;

...

DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`testuser`@`testmachine`*/ 
/*!50003 TRIGGER `trigger_one` BEFORE INSERT ON `mytable`
FOR EACH ROW
  SET NEW.`mycol` := 1 */;;
DELIMITER ;

...

21.3.1 Trigger Syntax and Examples

...

... To affect trigger order, specify a clause after FOR EACH ROW that indicates FOLLOWS or PRECEDES and the name of an existing trigger that also has the same trigger event and action time. ...

...

关于具有多个触发器的 mysqldump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38096489/

相关文章:

MYSQL SELECT 返回带时区计算的时间戳

javascript - 删除表行jquery

mysql - SQL 查询失败,数据库字段字符串包含撇号

mysql - 运行报告时参数消失

mysql - SQL 查询以获取另一个表中具有 X 计数的元素的 ID

php - 从 while 循环向数据库插入多行

mysql - 错误 "mysql could not fetch schema table status"

mysql - 读取 TYPOscript fe_users 在 COA 中不起作用

java - 从 java 连接到 mysql 的访问被拒绝

mysql - 从 MYSQL 迁移到 Elasticsearch 的最佳方式是什么?