
バックアップは適切であり、必要なときに正常に機能する場合はさらに優れています。 プロジェクトの1つでは、745個のトリガーのダンプを復元し、それらを稼働中のMySQLデータベースにロールする必要がありました。
MySQLでは、ピリオドの使用を含め、任意のトリガー名を使用できます(
例 :
analitica.cron.indeg.y.run.a_insert
)。 また、
mysqldumpは、ダンプの作成時にこれを考慮せず、次の形式のドロップの構築を追加します。
;
これらのダンプを、これらのトリガーがすでに作成されているベースにロールしようとすると、キャッチが待機します。 MySQLの観点から見ると、このクエリはその名前のトリガーを見つけられないため、トリガーを削除しません。 正しく動作させるには、トリガー名をアポストロフィで囲む必要があります。
回避策を見つけるために、
Perconaトラッカーバグに対応するレポートを登録しましたが、公式の
MySQLトラッカーで同じレポートを既に複製してい
ます 。
このバグを修正するには時間がかかるため、今すぐダンプが必要です。 この問題を最も簡単な方法、つまり
mysqldump自体で解決することにしました。 これを行うために、GitHubからPerkonovsky配布キット
MySQL 5.6の公式リポジトリを複製しました。
git clone --recursive --depth 1 https://github.com/percona/percona-server/
client/mysqldump.c
ファイルを開き、いくつかの場所でアポストロフィを
DROP TRIGGER IF EXISTS
コンストラクトに追加しました。
diffを見ると、次のパッチを取得できます。
@@ -3517,7 +3517,7 @@ static void dump_trigger_old(FILE *sql_file, MYSQL_RES *show_triggers_rs, fprintf(sql_file, "/*!50003 SET @OLD_SQL_MODE=@@SQL_MODE*/;\n"); if (opt_drop_trigger) - fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS %s */;\n", (*show_trigger_row)[0]); + fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS `%s` */;\n", (*show_trigger_row)[0]); fprintf(sql_file, "DELIMITER ;;\n" @@ -3604,7 +3604,7 @@ static int dump_trigger(FILE *sql_file, MYSQL_RES *show_create_trigger_rs, switch_sql_mode(sql_file, ";", row[1]); if (opt_drop_trigger) - fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS %s */;\n", row[0]); + fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS `%s` */;\n", row[0]);
パッチを当てたバージョンをビルドするには、Ubuntu / Debianにいくつかのパッケージをインストールし、Perconaドキュメントのパラメーターを使用して
cmakeを実行し、ビルド
mysqldumpのみを作成する必要があります。
apt-get install build-essential cmake bison libaio-dev libncurses5-dev libreadline-dev cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_CONFIG=mysql_release -DFEATURE_SET=community -DWITH_EMBEDDED_SERVER=OFF make mysqldump
コンパイル後、トリガー名が正しくエスケープされた
mysqldumpのパッチが適用されたバージョンを取得します。 新しいダンパーでダンプできます:
./percona-server/client/mysqldump \ --socket=/var/run/mysqld/mysqld.sock \ -uroot -p --routines --events --triggers \ --add-drop-trigger --quote-names \ --no-create-info --no-data --no-create-db --skip-opt \ database_name | sed -r 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > dump.sql