MySQLのデータベースをトランザクション内でダンプする
MySQLのデータベースをダンプする際,mysqldump の --single-transaction フラグ を用いることで,ダンプ処理全体をトランザクションで囲むことができます.
今回,ダンプをトランザクションで囲むメリットについて話そうと思います.
MySQLでデータベースをダンプする際,mysqldump というユーティリティはよく使われます.
一般的に,下記のように使います.
mysqldump --result-file=output.sql databasename --user=username
mysqldump は,デフォルトでテーブルをロックしているってご存知でしたか?
mysqldump のドキュメンテーションを確認してみましょう.
mysqldumprequires at least theSELECTprivilege for dumped tables,SHOW VIEWfor dumped views,TRIGGERfor dumped triggers,LOCK TABLESif the--single-transactionoption is not used, and (as of MySQL 8.0.21)PROCESSif the--no-tablespacesoption is not used. [引用者強調]
テーブルをロックすると,ダンプ中,他のSQLセッションはテーブルを読み取れません.無論,書き込みもできません. ドキュメンテーションにもその挙動が記載されています.
LOCK TABLESEnables use of explicit
LOCK TABLESstatements to lock tables for which you have theSELECTprivilege. This includes use of write locks, which prevents other sessions from reading the locked table. [引用者強調]
つまり,巨大なテーブルのダンプを不用意に開始すると,アプリケーション全体が停止してしまう危険性があります. まずいですよね.www
その上,LOCK TABLES はテーブル1つ1つに対して行われるので,mysqldump をそのまま使うと,テーブル同士のデータの一貫性を担保できません.
--single-transaction フラグで,ダンプ処理をトランザクションで囲むことにより,LOCK TABLES が発生しなくなり,アプリケーションを停止させずにダンプすることができます.
また,トランザクションのおかげでテーブル同士のデータの一貫性も担保できます.
上記を踏まえ,これからは --single-transaction フラグ を使って,下記のように運用データベースをダンプしましょう.
mysqldump --result-file=output.sql databasename --user=username --single-transaction