DDLが同時に使用されている場合、mysqldumpとシングルトランザクションを使用して正しいダンプを取得する方法は?

StackOverflow https://stackoverflow.com/questions/451404

  •  19-08-2019
  •  | 
  •  

質問

MySQLを初めて使用し、mysqldumpを使用してオンラインホット論理バックアップを実行する最良の方法を見つけています。 このページは、このコマンドラインを提案します:

mysqldump --single-transaction --flush-logs --master-data=2
          --all-databases > backup_sunday_1_PM.sql

しかし...ドキュメントを注意深く読んだ場合あなたはそれを見つける

  

有効なダンプファイルを確認するために、--single-transactionダンプの処理中   (テーブルの内容とバイナリログの位置が正しい)、他の接続は使用できません   次のステートメント:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE。 A   一貫した読み取りはこれらのステートメントから分離されないため、テーブルでそれらを使用して   ダンプされると、SELECTによって実行される<=>がテーブルの内容を取得する可能性があります   間違ったコンテンツを取得するか、失敗します。

では、このダンプの破損の可能性を防ぐ方法はありますか? つまりこれらのステートメントを一時的にブロックする可能性のあるコマンド。

PS:このテーマのMySQLバグエントリ http://bugs.mysql.com/ bug.php?id = 27850

役に立ちましたか?

解決

mysqlコマンドウィンドウを開き、次のコマンドを発行します。

mysql> FLUSH TABLES WITH READ LOCK;

これにより、UNLOCK TABLESを発行する(またはこれらの読み取りロックを保持するクライアント接続を終了する)まで、このMySQLインスタンスの all データベースの all テーブルがロックされます。

これを確認するには、別のコマンドウィンドウを開いて、ALTERDROPRENAME、またはTRUNCATEを実行してみます。これらのコマンドはハングし、読み取りロックが解除されるのを待ちます。 Ctrl-Cを押して、待機を終了します。

ただし、テーブルに読み取りロックがある場合でも、mysqldumpバックアップを実行できます。

FLUSH TABLES WITH READ LOCKコマンド は、--lock-all-tablesの<=>オプションを使用した場合と同じです。完全に明確ではありませんが、このドキュメントはサポートしているようですそれ:

  

UNLOCK TABLESのもう1つの用途は   取得したグローバル読み取りロックを解除します   読み取りロック付きのフラッシュテーブル付き。

<=>と<=>の両方で、フレーズ<!> quot; global read lock、<!> quot;を使用します。これらが同じことをする可能性が高いと思います。したがって、このオプションを使用して<=>を実行し、ALTER、DROP、RENAME、およびTRUNCATEの同時実行を防ぐことができます。


あなたのコメント:以下は、リンクしたMySQLバグログのGuilhem Bichotからのものです。

  

こんにちは。 --lock-all-tablesはFLUSHを呼び出します   読み取りロック付きのテーブル。したがって、それは   ALTER、DROP、RENAME、   またはTRUNCATE(バグまたは   私が間違っている)。ただし、-lock-all-tables   --single-transactionは機能しません(mysqldumpはエラーメッセージをスローします):   lock-all-tablesはすべてをロックするため   書き込みに対するサーバーのテーブル   バックアップの期間中、   一方、単一トランザクションが意図されています   バックアップ中に書き込みが行われるようにする   (一貫性読み取りSELECTを使用して   トランザクション)、それらは互換性がありません   自然の中で。

これから、バックアップ中に同時アクセスを取得できず、ALTER、DROP、RENAME、TRUNCATEを同時にブロックできないように思えます。

他のヒント

ドキュメントのその部分を読んでいるのと同じことを考えましたが、より多くの情報を見つけました:

4.5.4。 mysqldump <!>#8212;データベースバックアッププログラム http://dev.mysql.com/doc/en/mysqldump.html

  

InnoDBテーブルの場合、mysqldumpはオンラインを作成する方法を提供します   バックアップ:

shell> mysqldump --all-databases --single-transaction > all_databases.sql
     

このバックアップは、すべてのテーブルでグローバル読み取りロックを取得します(FLUSHを使用   ダンプの開始時の読み取りロック付きテーブル)。これで   ロックが取得され、バイナリログ座標が読み取られ、   ロックが解除されます。長い更新ステートメントが実行されている場合   FLUSHステートメントが発行されると、MySQLサーバーが停止する可能性があります   これらのステートメントは終了します。その後、ダンプはロックフリーになり、   テーブルの読み取りと書き込みを妨げません。更新する場合   MySQLサーバーが受け取るステートメントは短い(   実行時間)、初期ロック期間は目立つべきではありません、   多数の更新があります。

--opt および --single-transaction オプション:

  

-opt

     

このオプションは略記です。指定するのと同じです   --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset高速なダンプ操作を提供し、リロードできるダンプファイルを生成する必要があります。   MySQLサーバーにすばやく接続します。

     

-optオプションはデフォルトで有効になっています。無効にするには--skip-optを使用します。

質問を正しく理解する場合、実際のデータとDDL(データ定義言語)を一緒に使用する必要があります。DDLのみが必要な場合は--no-dataを使用するからです。詳細については、次を参照してください。

http://dev.mysql .com / doc / workbench / en / wb-reverse-engineer-create-script.html

  

作成する場合は、mysqldumpで--databasesオプションを使用します   データベースとそのすべてのオブジェクト。 CREATE DATABASEがない場合   スクリプトファイルのdb_nameステートメント、データベースをインポートする必要があります   既存のスキーマへのオブジェクト、またはスキーマがない場合は新しい   名前のないスキーマが作成されます。

MySQL 5決定版ガイドby Michael Kofler 次のオプションをお勧めします。

--skip-opt
--single-transaction
--add-drop-table
--create-options
--quick
--extended-insert
--set-charset
--disable-keys

さらに、言及されていないのは --order-by-primary また、 --databases オプションを使用している場合、 --add-drop-database 特にこの回答と組み合わせた場合、異なるネットワークに接続しているデータベースをバックアップする場合は、 --compress オプション。

したがって、mysqldumpコマンド(--disable-keys、<=>、または<=>オプションを使用しない)は次のようになります。

mysqldump --skip-opt --order-by-primary --single-transaction --add-drop-table --create-options --quick --extended-insert --set-charset -h db_host -u username --password="myPassword" db_name | mysql --host=other_host db_name

私は理解しているようにInnoDBでは効果的ではないので、本で与えられた<=>への参照を削除しました。 MySqlマニュアルの状態:

  

各テーブルで、INSERTステートメントを/ *!40000 ALTERで囲みます   TABLE tbl_name DISABLE KEYS /;および/ !40000 ALTER TABLE tbl_name   キーを有効にする* /;ステートメント。これにより、ダンプファイルの読み込みが速くなります   すべての行が挿入された後にインデックスが作成されるためです。この   このオプションは、MyISAMテーブルの一意でないインデックスに対してのみ有効です。

このバグレポートも見つかりました http://bugs.mysql.com/bug .php?id = 64309 いくつかの本を書いたポールデュボア。このバグレポート内で見つかったコメント以外に、この特定の問題については言及していません。

<!> quot; Ultimate Backup <!> quot;を作成します。このシェルスクリプトの行に沿って何かを検討することをお勧めします

  1. https://github.com /red-ant/mysql-svn-backup/blob/master/mysql-svn.sh

テーブルをロックしないと一貫したダンプを取得できません。ダンプを実行するのに2分かかることに気付かない時間帯に、私は自分のことをしています。

1つの解決策は、レプリケーションを実行してから、マスターではなくスレーブをバックアップすることです。スレーブがバックアップ中に書き込みを見逃した場合、後で追いつくでしょう。これにより、マスターで障害が発生した場合に備えて、ライブバックアップサーバーが残ります。どちらがいいですか。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top