自宅でmysqldumpにパッチを適用する

画像

バックアップは適切であり、必要なときに正常に機能する場合はさらに優れています。 プロジェクトの1つでは、745個のトリガーのダンプを復元し、それらを稼働中のMySQLデータベースにロールする必要がありました。



MySQLでは、ピリオドの使用を含め、任意のトリガー名を使用できます( analitica.cron.indeg.y.run.a_insert



)。 また、 mysqldumpは、ダンプの作成時にこれを考慮せず、次の形式のドロップの構築を追加します。



 /*!50032 DROP TRIGGER IF EXISTS analitica.cron.indeg.y.run.a_insert */;
      
      





これらのダンプを、これらのトリガーがすでに作成されているベースにロールしようとすると、キャッチが待機します。 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
      
      






All Articles