読者です 読者をやめる 読者になる 読者になる

Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

mysqldump --dump-slave について


MySQL5.5から追加になった、--dump-slaveオプションをつけてmysqldumpを実行すると、バックアップの最中Slave_SQL_Threadが停止してしまう。
これでは、--single-transactionオプションのメリットが大きく削がれてしまうことになる。
mysqluftに参加させていただいたときに、@さんにこのことについて相談したところ、バグ登録され、そのついでにパッチが書かれるという超俺得な出来事があった。

「FLUSH TABLES WITH READ LOCKしてないじゃん」という内容だが、Slave_SQL_Threadが停止してしまう問題についても一緒に対応してくださった模様。
@さんありがとうございました。
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と組み合わせる場合はバージョンに注意。
詳しくは@さんの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
・
・
[ダンプ処理]