2016-06-29 28 views
1

我正在使用mysqldump創建備份並將其恢復到另一臺服務器上。帶多個觸發器的mysqldump

我在這個數據庫上使用了很多功能之一就是觸發器。看起來,如果數據庫上的任何一個操作都有多個觸發器,則由於依賴於尚未創建的對象(第二個觸發器),還原失敗。

原因似乎是兩個觸發器聲明都包含對彼此的引用。但是,當它們按順序執行時,第一個失敗。

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

[and then a bit further down] 

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

我已經分離數據和結構,還分離結構「只是觸發」和「一切,但」在Percona的博客以下this article,但問題的存在,我想能夠自動執行備份和複製。

+0

使用的每臺服務器上的MySQL版本?你能顯示錯誤信息嗎? – wchiquito

+0

5.7.13在兩臺服務器上。 – Hans

回答

1

我無法重現該問題。

我沒有非常清楚在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

...

...要影響的觸發順序,後指定一個子句每一行 表示跟隨或前導和現有觸發器的名稱即 也具有相同的觸發事件和動作時間。 ...

...

+0

Percona引用5.5。我完全可以做你正在做的事情。我遇到的問題是,當我運行'mysqldump --no-create-info --skip-triggers sakila> data.sql'兩個觸發器定義中的第一個包含'PRECEDES trigger_one'時,我通過My​​SQL工作臺但會嘗試使用命令行 - 我認爲它幾乎相同。 – Hans

+0

@Hans:感謝您指出文章的MySQL版本。該文件說:'mysqldump以激活順序轉儲觸發器,以便在重新加載轉儲文件時,觸發器以相同的激活順序創建。 [5.5.4 mysqldump - 數據庫備份程序](http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html),這就是我無法確定問題出在哪裏的原因。 – wchiquito

+0

是的,我看到了,但在我的輸出中,每個觸發器都包含完整的前/後語法,這意味着存在循環引用。它無法導入。我甚至使用'在一個交易'選項。 – Hans