MySQLのデータベースをトランザクション内でダンプする
MySQLのデータベースをダンプする際,mysqldump
の --single-transaction
フラグ を用いることで,ダンプ処理全体をトランザクションで囲むことができます.
今回,ダンプをトランザクションで囲むメリットについて話そうと思います.
MySQLでデータベースをダンプする際,mysqldump
というユーティリティはよく使われます.
一般的に,下記のように使います.
mysqldump --result-file=output.sql databasename --user=username
mysqldump
は,デフォルトでテーブルをロックしているってご存知でしたか?
mysqldump
のドキュメンテーションを確認してみましょう.
mysqldump
requires at least theSELECT
privilege for dumped tables,SHOW VIEW
for dumped views,TRIGGER
for dumped triggers,LOCK TABLES
if the--single-transaction
option is not used, and (as of MySQL 8.0.21)PROCESS
if the--no-tablespaces
option is not used. [引用者強調]
テーブルをロックすると,ダンプ中,他のSQLセッションはテーブルを読み取れません.無論,書き込みもできません. ドキュメンテーションにもその挙動が記載されています.
LOCK TABLES
Enables use of explicit
LOCK TABLES
statements to lock tables for which you have theSELECT
privilege. 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