mysqldumpの--single-transactionでデータの整合性を保つ
先日、データに不整合があり、調査するとダンプの仕方がよくなかったことがわかりました。
色々調べてわかったことを備忘録的にまとめます。
--single-transactionを使う
mysqldump db_name > backup-file.sql
上記が基本的なmysqldumpの使い方です。
しかし、デフォルトの状態でダンプすると、整合性のないダンプファイルが作成される可能性があります。
不整合が起こるのはテーブルをロックせずに、オンラインでダンプをするケースです。
例えば、テーブルA->テーブルB->テーブルCの順にダンプするとします。
テーブルBのダンプ中にテーブルAとテーブルCにデータが追加された場合、テーブルCに追加されたデータはダンプされるけど、テーブルAに追加されたデータはダンプされないといった不整合が起こります。
データの不整合が問題となる場合は、--single-transaction
を使いましょう!
mysqldump db_name --single-transaction > backup-file.sql
--single-transaction
はトランザクションを開始してからダンプを行うためのオプションで、トランザクション開始時点のデータをダンプすることができます。
注意しないといけないのはInnoDBの場合のみ有効なオプションだということです。
InnoDBが何かはよくわかってないですが😅
--skip-lock-tablesも使う必要があるのか?
mysqldump db_name --single-transaction --skip-lock-tables > backup-file.sql
テーブルをロックしないために --skip-lock-tables
を使っているのをよく見かけます。
ただ、ドキュメントには --lock-tables
と --single-transaction
は相互に排他的で、--single-transaction
を使うと、--lock-tables
はオフになると書かれています。
実際、ソースコードを見ると、--single-transaction
を指定していると lock_tables = false
になっています。
なので、--single-transaction
を使う場合は、--skip-lock-tables
は不要ですね!
The --single-transaction option and the --lock-tables option are mutually exclusive because LOCK TABLES causes any pending transactions to be committed implicitly. So this option automatically turns off --lock-tables
(おまけ)DBeaverで--single-transactionを使う
Export configuration->Execution Methodを Online backup in single transaction
にします。
参考
私たち BABY JOB は、子育てを取り巻く社会のあり方を変え、「すべての人が子育てを楽しいと思える社会」の実現を目指すスタートアップ企業です。圧倒的なぬくもりと当事者意識をもって、こどもと向き合う時間、そして心のゆとりが生まれるサービスを創出します。baby-job.co.jp/
Discussion