MySQLのクライアントプログラム
MySQLのパッケージにはMySQLサーバーであるmysqld
の他に、
今回は、mysqldump
コマンドについて説明します。
デモ用の環境はCentOS 7.
mysqldump
mysqldump
はMySQLの論理バックアップを取得するためのプログラムです。簡単な使い方は第15回 mysqldumpを使ってバックアップするにまとまっていますので、
また、
mysqldumpの論理バックアップ
mysqldump
の論理バックアップはSELECT * FROM ..
ステートメント)INSERT INTO ..
ステートメントまたはLOAD DATA
,LOAD XML
などのステートメント)
このことを知っておくと、
--single-transaction
オプションと--lock-all-tables
オプション
mysqldump
のオプションのうちもっとも大切なものはこの2つです。この2つは同時に指定することができませんのでどちらかを選択して使用することになります。 デフォルトではどちらもOFFです。
ドキュメント上の記載は以下のURLを参照してください。
--single-transaction
がONの場合
--single-transaction
オプションが有効な場合、mysqldump
はバックアップを取得するために実行する全てのSELECT * FROM ..
ステートメントを1つのトランザクションとして実行します。具体的には概ね以下のようなSQLが実行されることになります。
トランザクション分離レベルにREPEATABLE READを指定することで、
これにより、--single-transaction
オプションではデータの一貫性を保つことができません。後述の--lock-all-tables
オプションを利用することになります。
MySQL 5.--single-transaction
を利用した場合ではそれらのテーブルとデータの整合性は保証することができません。が、mysqldump
でバックアップを取得している最中にmysqlスキーマが更新されるCREATE USER
で新しいユーザーを作成する、GRANT
でユーザーに権限を割り当てる、CREATE PROCEDURE
でストアドプロシージャを作成する、INSTALL PLUGIN
でプラグインをインストールする…など)
--lock-all-tables
がONの場合
--lock-all-tables
オプションが有効な場合、mysqldump
はバックアップ実行中にデータベース全体に読み取りロックをかけ続けます。先程と同じようにSQLで例示すると以下のようになります。
mysqldump
の実行中に全ての書き込みをブロックすることで、mysqldump
の実行中に全ての書き込みをブロックしない限りはトランザクション非対応のストレージエンジン間でデータの整合性を保証することは できません 。
しかしながら、mysqldump
を実行することになります。
--single-transaction
,--lock-all-tables
がいずれもOFFの場合
これら--single-transaction
および--lock-all-tables
がいずれもOFFの場合はどうなるでしょうか。非常に残念なことに、
スキーマ単位でテーブルロックを取得して、
残念ながらMySQL 5.--single-transaction
または--lock-all-tables
を明示的に指定しなかった場合はこの動作となります。
注意事項
「--single-transaction
オプションを指定した場合、FLUSH TABLES WITH READ LOCK
が一瞬だけ走る」mysqldump
でバックアップを取得する多くの場合、FLUSH TABLES WITH READ LOCK
が走ります)。
ただしこれは--single-transaction
オプションに起因するものではなく、--master-data
を指定していると思います)。これらを指定しない場合、--single-transaction
ではFLUSH TABLES WITH READ LOCK
は実行されません。
これらのオプションと--single-transaction
を同時に指定することで、FLUSH TABLES WITH READ LOCK
後にトランザクションの開始およびバイナリーログの操作が終われば、UNLOCK TABLES
)」されます。ロックを解放するためのステートメントが--single-transaction
オプションに紐付いているため、--single-transaction
が指定されていない場合は、FLUSH TABLES WITH READ LOCK
はmysqldump
が終了するまで解放されません。--lock-all-tables
を有効にしている状態ではもともとバックアップ終了までロックが継続することを期待しているので問題ありませんが、
まとめ
mysqldump
はMySQLの論理バックアップを取るためのプログラムですが、--single-transaction
または--lock-all-tables
を指定しない場合、
mysqlスキーマを除いた全てのテーブルがInnoDBストレージエンジンである場合は--single-transaction
オプションを、--lock-all-tables
オプションを利用する必要があります。
--single-transaction
においてFLUSH TABLES WITH READ LOCK
が実行されるのは--master-data
または--flush-logs
が同時に指定されている場合です。