FLUSH TABLES WITH READ LOCK
このコマンドを使用すると、テーブルをREADロックつきでいったんFLUSHしてくれる。つまり、ある時点で全ての書き込みを反映し、それ以降の書き込みを停止させるのである。ここでのロックはテーブルロックであり、ストレージエンジンの上位層で行われるため新たな書き込みのリクエストは完全に遮断される。
FLUSH TABLESコマンドはテーブルをクローズする。もっと具体的に言うと、スレッドが保持しているテーブルキャッシュを全て破棄する。テーブルキャッシュの実体はHandlerクラスのインスタンスであり、MyISAMではここでファイルディスクリプタを保持している。そしてそのファイル(ディスクリプタ)は、最後のインスタンスが解放される時にクローズされる。
FLUSHコマンドに関するマニュアルは以下を参照のこと。 http://dev.mysql.com/doc/refman/5.1/ja/flush.html
MyISAM
前述の通り、MyISAMではいったん全てのファイルがFLUSH TABLESによって閉じられるので、それまでに行われた書き込みが全てファイルに反映される。その時点でいつでもスナップショットをとることが可能である。FLUSH TABLES WITH READ LOCKはMyISAMのためにあると言っても過言ではない。
InnoDB
こちらは少し複雑である。何故ならば、FLUSH TABLES WITH READ LOCKによってファイルが閉じられないからである。
InnoDBは専用のテーブルスペースとログを使用しているが、ログからテーブルスペースへの書き込みは非同期で(バックグラウンドで)行われる。従って、FLUSH TABLES WITH READ LOCKをした時点ではログからテーブルスペースへ書き込みの真っ最中かも知れないのだ。
ファイルを開いている間にスナップショットをとるとどうなるか?
InnoDBか ら見ると、まさにシステムが電源断やカーネルのパニック等でクラッシュしたときと同じに見えるだろう。取得したスナップショットを使ってリストアをする と、クラッシュ時と同じように自動的にリカバリが行われる。一つ言えることは、完了したトランザクションは全てログに残っているので、それらが失われるこ とがない。まだテーブルスペースへ反映されていない書き込みは、REDO処理によりMySQLサーバ再起同時に反映されることになる。
FLUSH TABLES WITH READ LOCKにより、ある時点以降にトランザクションのコミット(テーブルへの書き込み)がないことを保証できるので、コマンドを使用する価値が一応はあるだろう。
さらに・・・
スナップショットでバックアップ - MySQL Practice Wiki
