--single-transaction
オプションはmysqldump
ありません行うFLUSH TABLES WITH READ LOCK
前にバックアップジョブを開始するだけで、一定の条件の下で。これらの条件の1つは、--master-data
オプションも指定した場合です。
ソースコードのmysql-5.6.19/client/mysqldump.c
5797行目から:
if ((opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs)) &&
do_flush_tables_read_lock(mysql))
goto err;
反復可能読み取りトランザクションを開始する前に正確なバイナリログ座標を確実にロックするには、この--master-data
オプションを使用してこのロックを取得し、バイナリログ座標が取得されると解放します。
実際、最初のフラッシュに時間がかかる場合に両方を実行すると、読み取りロックをより速く取得できるためmysqldump
、のFLUSH TABLES
後にaが続きFLUSH TABLES WITH READ LOCK
ます。
...しかしながら...
binlogの座標を取得するとすぐにmysqldump
、UNLOCK TABLES
ステートメントを発行するので、開始したフラッシュの結果として何もブロックされないはずです。またWaiting for table flush
、mysqldump
保持しているトランザクションの結果としてスレッドが発生することはありません。
Waiting for table flush
状態のスレッドが表示された場合、それはFLUSH TABLES [WITH READ LOCK]
ステートメントが発行され、クエリの開始時にまだ実行中であったことを意味します。クエリは、実行する前にテーブルのフラッシュを待機する必要があります。あなたが投稿したプロセスリストの場合、mysqldump
はこの同じテーブルから読み取りを行っており、クエリはしばらく実行されていますが、ブロッククエリはその間ずっとブロックされていません。
これはすべて、何か他のことが起こったことを示唆しています。
バグ#44884でFLUSH TABLES
内部的に機能する方法について説明されている長期にわたる問題があります。 問題が解決しない場合でも、私は驚くことではありません。この問題が解決されると、非常に複雑な問題であるため、この問題が「修正」されても驚くことはありません。それを修正することは、何かを壊したり、新しく異なった、それでもなお望ましくない振る舞いを作成したりする重大なリスクを伴います。
これはあなたが見ているものの説明になると思われます。
具体的には:
テーブルに対して長時間実行されているクエリを実行していて、を発行FLUSH TABLES
した場合、FLUSH TABLES
は長時間実行されているクエリが完了するまでブロックされます。
さらに、FLUSH TABLES
が発行された後に始まるクエリは、FLUSH TABLES
が完了するまでブロックされます。
さらに、FLUSH TABLES
クエリを強制終了しても、ブロックされたクエリは、元の長時間実行クエリ(クエリをブロックしていたクエリ)で引き続きブロックさFLUSH TABLES
れFLUSH TABLES
ます。強制終了されたクエリが完了していなくても、そのテーブル(またはさらに、実行時間の長いクエリに関与している)はまだフラッシュされており、その実行中のフラッシュは、実行時間の長いクエリが完了するとすぐに発生しますが、その前ではありません。
ここで考えられる結論は、別のプロセス-おそらく別のmysqldump、または不適切なクエリ、または不適切に記述された監視プロセスがテーブルをフラッシュしようとしたことです。
その後、そのクエリは不明なメカニズムによって強制mysqldump
終了またはタイムアウトされましたが、問題の後処理は、問題のテーブルからの読み取りが完了するまで続きました。
FLUSH TABLES
長時間実行クエリの処理中に試行することで、この状態を再現できます。次に、ブロックする別のクエリを開始します。次に、FLUSH TABLES
クエリを強制終了します。これにより、最新のクエリのブロックが解除されません。次に、最初のクエリを強制終了するか、終了させれば、最後のクエリが正常に実行されます。
後から考えると、これは無関係です。
Trx read view will not see trx with id >= 1252538405, sees < 1252538391
はをmysqldump --single-transaction
発行するためSTART TRANSACTION WITH CONSISTENT SNAPSHOT
、これは正常です。これにより、ダンプの進行中に変更されたデータをダンプできなくなります。それがなければ、最初に得られたbinlog座標は意味をなさない--single-transaction
でしょう。このWaiting for table flush
トランザクションは明らかにロックを保持していないため、これは決して問題とは関係ありません。