6

私は 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。一貫性のある読み取りはこれらのステートメントから分離されていないため、ダンプ対象のテーブルでこれらのステートメントを使用すると、テーブルの内容を取得するSELECT実行者が誤った内容を取得したり、失敗したりする可能性があります。mysqldump

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

PS: この件に関する MySQL バグ エントリhttp://bugs.mysql.com/bug.php?id=27850

4

4 に答える 4

9

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

mysql> FLUSH TABLES WITH READ LOCK;

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

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

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

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

UNLOCK TABLESのもう1つの用途は、FLUSH TABLES WITHREADLOCKで取得したグローバル読み取りロックを解放することです。

どちらも「グローバル読み取りロック」というフレーズFLUSH TABLES WITH READ LOCK--lock-all-tables使用しているので、これらは同じことをする可能性が高いと思います。mysqldumpしたがって、このオプションを使用して、ALTER、DROP、RENAME、およびTRUNCATEの同時実行を防ぐことができます。


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

やあ。--lock-all-tablesは、READLOCKを使用してFLUSHTABLESを呼び出します。したがって、ALTER、DROP、RENAME、またはTRUNCATEをブロックすることが期待されます(バグがあるか、私が間違っている場合を除く)。ただし、-lock-all-tables --single-transactionは機能しません(mysqldumpはエラーメッセージをスローします):lock-all-tablesはバックアップの期間中、書き込みに対してサーバーのすべてのテーブルをロックしますが、single-transactionはバックアップ中に書き込みを発生させることを目的として(トランザクションで一貫性のある読み取りSELECTを使用することにより)、それらは本質的に互換性がありません。

このことから、バックアップ中に同時アクセスを取得すると同時に、ALTER、DROP、RENAME、およびTRUNCATEをブロックすることはできないようです。

于 2009-01-23T21:30:37.717 に答える
2

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

4.5.4. mysqldump — データベース バックアップ プログラム http://dev.mysql.com/doc/en/mysqldump.html

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

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

このバックアップは、ダンプの開始時にすべてのテーブルでグローバル読み取りロックを取得します (FLUSH TABLES WITH READ LOCK を使用)。このロックが取得されるとすぐに、バイナリ ログ座標が読み取られ、ロックが解放されます。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. 詳細については、次の URL を参照してください。

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

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

The Definitive Guide to 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 コマンド (、、、またはオプションを使用しない--compress)--databases--add-drop-database次のようになります。

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

--disable-keys私が理解しているように、InnoDBでは効果がないため、本に記載されている参照を削除しました。MySql マニュアルには次のように記載されています。

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

また、このバグレポートhttp://bugs.mysql.com/bug.php?id=64309を見つけました。これには、Paul DuBois からのコメントが下部にあり、この特定の問題以外には参照していない本もいくつか書いています。そのバグレポート内にあるコメント。

「究極のバックアップ」を作成するには、このシェルスクリプトの行に沿って何かを検討することをお勧めします

  1. https://github.com/red-ant/mysql-svn-backup/blob/master/mysql-svn.sh
于 2014-02-19T03:39:57.487 に答える
1

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

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

于 2013-05-12T14:48:39.483 に答える