2016-06-29 6 views
1

Я использую mysqldump для создания и восстановления резервной копии на другой сервер.mysqldump с несколькими триггерами

Одной из особенностей, которые я использую в этой базе данных, является триггеры. Похоже, что если есть несколько триггеров для любого действия в базе данных, восстановление происходит из-за зависимости от объекта (второго триггера), который еще не создан.

Причина заключается в том, что оба объявления триггера содержат ссылку друг на друга. Но поскольку они выполняются последовательно, первое из них не выполняется.

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

[and then a bit further down] 

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

Я отделенный данные и структуру, а также отделенную структуру как «просто запускает» и «все, но» следующий this article на блоге Percona, но проблема существует, и я хотел бы иметь возможность автоматизировать резервное копирование и репликации.

+0

Какая версия MySQL используется на каждом сервере ?. Можете ли вы показать сообщение об ошибке ?. – wchiquito

+0

5.7.13 на обоих серверах. – Hans

ответ

1

Я не могу воспроизвести проблему.

У меня нет очень ясной версии MySQL, используемой в статье Percona, но я сомневаюсь, что это 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». Я запускаю это через Workbench MySQL но попробую использовать командную строку, которая, как я предполагала, почти такая же. – Hans

+0

@ Ханс: Спасибо, что указали версию MySQL в MySQL. В документации говорится: 'mysqldump запускает триггеры в порядке активации, так что, когда файл дампа перезагружается, триггеры создаются в том же порядке активации. '. [5.5.4 mysqldump - программа резервного копирования базы данных] (http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html), поэтому я не могу определить, где проблема. – wchiquito

+0

Да, я это видел, но на моем выходе каждый триггер содержал полный синтаксис предшествующих/последующих, что означает, что существует циклическая ссылка. Он не работает при импорте. Я даже использовал опцию «в одной транзакции». – Hans