mysqldump --dump-slave について
MySQL5.5から追加になった、--dump-slaveオプションをつけてmysqldumpを実行すると、バックアップの最中Slave_SQL_Threadが停止してしまう。
これでは、--single-transactionオプションのメリットが大きく削がれてしまうことになる。
mysqluftに参加させていただいたときに、@nippondanjiさんにこのことについて相談したところ、バグ登録され、そのついでにパッチが書かれるという超俺得な出来事があった。
「FLUSH TABLES WITH READ LOCKしてないじゃん」という内容だが、Slave_SQL_Threadが停止してしまう問題についても一緒に対応してくださった模様。
@nippondanjiさんありがとうございました。
MySQL Bugs: #65035: FLUSH TABLES is missing on mysqldump with --dump-slave
MySQL5.1までのmysqldump
Replication構成を取っている場合の定期的なオンラインバックアップは、可能な限りスレーブで行いたいとお思いの方が多いことでしょう。
5.1までだったらこんな感じでバックアップする場合が多いと思います。
mysqldump -u user -p --master-data=2 --single-transaction --databases DB1 DB2 > dump.sql
- --single-transaction
- 一貫性を保持したバックアップが可能。トランザクション開始時のスナップショットを取得し、他のトランザクションの影響を受けない。
- --master-data=2
- SHOW MASTER STATUSの結果をコメントとしてダンプに含める。複数のDBを一回のmysqldumpでバックアップする場合は必須。
MySQL5.5で、--flush-logsと組み合わせる場合はバージョンに注意。
詳しくは@tmtmsさんのBLOGでどうぞ。
mysqldump --single-transaction に --flush-logs をつけてはいけない - @tmtms のメモ
MySQL5.5からのmysqldump
スレーブでバックアップを取得した時点で、マスターのbinlogのどのポジションまでレプリケーションが進行しているのかをダンプに含めてくれるようになった。
スレーブのSHOW MASTER STATUSの結果など、ほとんどの場合では有用ではないので大変ありがたいオプションである。
- --dump-slave
- スレーブからダンプをとった場合、スレーブが参照しているマスターの情報をCHANGE MASTERとしてダンプに含める。
- --apply-slave-statements
- STOP SLAVEおよびSTART SLAVEコマンドを、CHANGE MASTERの前後に追加する。
- --include-master-host-port
- CHANGE MASTERコマンドにマスターのホスト名とポートを含める。
引用・参考
漢(オトコ)のコンピュータ道: MySQLコミュニティ騒然!MySQL 5.5.4が与えるインパクト。
MySQL :: MySQL 5.5 Reference Manual :: 4.5.4 mysqldump — A Database Backup Program
MySQL5.5からのmysqldumpの挙動
大変素晴らしい--dump-slaveオプションなのだが、冒頭でも書いたとおり、困ったことにバックアップの最中Slave_SQL_Threadが停まってしまう。
パッチ適用前のmysqldump実行時の一般クエリログ
このように、ダンプ処理開始の前にSlave_SQL_Threadを停めてしまい、すべて終わってから最後にSTART SLAVEしている。
コレだとオンラインでのバックアップに使うことはとても出来ない。
root@localhost on /*!40100 SET @@SQL_MODE='' */ /*!40103 SET TIME_ZONE='+00:00' */ SHOW SLAVE STATUS STOP SLAVE SQL_THREAD SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ SHOW SLAVE STATUS UNLOCK TABLES ・ ・ [ダンプ処理] ・ ・ SHOW SLAVE STATUS START SLAVE
一方・・・
パッチ適用後のmysqldump実行時の一般クエリログ
START TRANSACTIONして、SHOW SLAVE STATUS、UNLOCK TABLESの後に、START SLAVEしている。
コレならば、オンラインで使うバックアップとしてかなり有用なオプションになる。
※FLUSH TABLES WITH READ LOCKも追加されてますね。
root@localhost on /*!40100 SET @@SQL_MODE='' */ /*!40103 SET TIME_ZONE='+00:00' */ SHOW SLAVE STATUS STOP SLAVE SQL_THREAD FLUSH TABLES FLUSH TABLES WITH READ LOCK SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ SHOW SLAVE STATUS UNLOCK TABLES SHOW SLAVE STATUS START SLAVE ・ ・ [ダンプ処理]