2017-10-03 6 views
0

--single-トランザクションのmysqldumpを実行しながら、大きなテーブルへの書き込みは、誰かがロックの期間を明確にすることはできますが--single-トランザクションで初期スナップショットを作成するために使用されると、 --quickオプションはありますか?--quick

私はバイナリログとデータベース(InnoDBの)で大きなテーブル(16ギガバイト、101M行)が有効になっています。私はこのテーブルでFK制約を使用しません。

BIN LOGファイルの数を管理しやすくするために、私は定期的にmysqldumpシードを更新する必要があります。私のサービスは新しいレコード(約35 /秒)を追加し続けますが、mysqldumpを実行できるようにしたいのです。

MySQLのドキュメントによると、スナップショットの作成時にロックが発生し、テーブルに書き込むことができます。それは瞬間ですか、それともテーブルのサイズに依存しますか? つまり、ロックが解除される前に内容全体を読む必要があります。

は、私は、スナップショットを生成しながら、私はテーブルに書き込むことができないだろうと心配しています。

誰かがテーブルダンプの開始時に何が起こるかを明確にしてもらえますか?そのプロセスを説明するリンクがありがたいです。

答えて

1

あなたは--single-transaction--master-dataを使用する場合は、mysqldumpを冒頭に次のことを行います。

FLUSH TABLES; 
FLUSH TABLES WITH READ LOCK; 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */; 
SHOW MASTER STATUS; 
UNLOCK TABLES; 

これらの操作がすべて完了すると、実際のバックアップが開始されます。ロックは、SHOW MASTER STATUSがトランザクションの先頭の正確なbinlog座標を正確に返すようにのみ必要です。

バックアップは書き込みをブロックすべきではなく、書き込みはバックアップをブロックすべきではありません。ただし、既存のトランザクションは、FLUSHステートメントが完了する前にコミットまたはロールバックする必要があります。これらのトランザクションは、確立されたトランザクションと相互作用して、新しいトランザクションがまだ開いている古いトランザクションの待機を停止します。しかし、これらの古いトランザクションが終了すると、問題は解決されます。長時間実行していないトランザクションを残していない場合は、問題はありません。

+0

素晴らしいので、一度最新のbinlog PKが読み込まれると、ロックが解放されます。上記のSQLを取得するにはどうすればよいですか(クエリログ)?期間をテストしたいと思います。また、BINLOGを使用しなかった場合はどうなりますか? – Nicholas

関連する問題