2016-06-29 1 views
1

私はmysqldumpを使ってバックアップを作成し、別のサーバにリストアしています。複数のトリガを持つmysqldump

私はこのデータベースで多くを使用している機能の1つにトリガーがあります。データベース上のいずれかのアクションに対して複数のトリガーが存在する場合、まだ作成されていないオブジェクト(第2のトリガー)への依存によってリストアが失敗しているように見えます。

理由は、両方のトリガー宣言には互いに参照が含まれているようです。しかし、それらが順番に実行されるとき、最初のものは失敗します。

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

[and then a bit further down] 

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

私はただトリガー 'とPerconaのブログにthis articleを以下「はすべて」、まだ問題があると私はバックアップを自動化できるようにしたいなどのデータと構造とも分離構造を分離しましたおよび複製。

+0

?。エラーメッセージを表示できますか?両方のサーバーで – 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

...

...トリガーの順序に影響を与えるために、 ことをFOR EACH ROWの後の句を指定しますFOLLOWSまたはPRECEDESを示し、既存のトリガーの名前 も同じトリガーイベントとアクション時間を持ちます。各サーバー上で使用しているのMySQLのバージョンは何...

...

+0

ペルコラは5.5を引用しています。私はあなたがしていることを完全に行うことができます。私が抱えている問題は、 'mysqldump --no-create-info --skip-triggers sakila> data.sql'を実行すると、最初の2つのトリガ定義に' PRECEDES trigger_one'が含まれています。これはMySQLワークベンチを通して実行していますしかし私はかなり同じであると仮定したコマンドラインを使ってみるでしょう。 – Hans

+0

@ハンス:記事のMySQL版を指してくれてありがとう。ドキュメントによれば、 'mysqldumpは起動時にトリガをダンプするので、ダンプファイルが再ロードされると、トリガは同じ起動順序で作成されます。 ' [5.5.4 mysqldump - データベースバックアッププログラム](http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html)、なぜ私は問題がどこにあるのか判断できません。 – wchiquito

+0

はい私はそれを見ましたが、私の出力では、各トリガには完全な先行/次の構文が含まれていました。つまり、循環参照があります。インポート時に失敗します。私は 'one transaction'オプションを使用しています。 – Hans

関連する問題