2012年11月2日金曜日

mysqlbinlogでバイナリログをバックアップするとか

mysqlbinlogは今まで(バックアップ用途で)リモートからバイナリログを読ませようとしても、

・SQLテキスト形式にエンコードした後のものを出力させるだけ。
・その時点の最後のエントリまでしか読み込めない。
・出力先ファイル名は1つしか指定できないので、
 読み込み元のバイナリログが複数でも出力は1つ。

だったのが、5.6のmysqlbinlogでは

・エンコードする前の状態のまま書き出せる。
・tail -fぽく待機して、更新があれば続けて書き出せる。
・ファイル名はマスターのものと同じものにできる。
 スイッチしたらmysqlbinlog側のファイル名も変わる。

と、スレーブに--log-slave-updatesを付けた様な動作が出来る様になった。
バックグラウンドにして常駐させておけば、暇そうなサーバにバイナリログをリアルタイムにバックアップ出来る。
マスターから見るとレプリケーションスレーブが1台増えるのと同じはずなので、
scpやftpで1時間に1回がりがり取るよりもI/O負荷的に優しい(たぶん)
バックアップ先のサーバから見た時に、一気に転送されるのとずっとちまちま転送されるのと
どっちが幸せなのかはちょっと考える余地があるかも。
運用してないので多数派がワカラナイ。。

mysqlbinlogさえ入っていればそれだけで済むので
バックアップ先のサーバにMySQL-clientパッケージだけ入れておけば良いし、
試してみる価値はありそうかなぁと。


使い方。

$ mysqlbinlog --read-from-remote-server --host=cent01 --user=repl --password=repl --stop-never --raw --result-file=cent01- bin.000001 &

--userにはREPLICATION SLAVE権限を持つユーザーを指定。
--stop-neverでtail -fっぽい動作になる。
--rawで、バイナリログをデコードせずにバイナリのまま、かつ、マスターのファイル名を踏襲してコピー。
--result-fileは--rawと一緒に指定した時は、保存先ファイル名のプレフィックスになるので、
cent01にはlog-bin=binと指定してあって大本のバイナリログファイル名がbin.000001~になる場合、
コピー先のバイナリログファイル名はcent01-bin.000001~になる。
最後の引数は、コピーを開始する最初のバイナリログファイル名。これはマスター上の名前で。

上手く使えばちょっとしたバックアップには使える予感。
--raw抜きで--stop-neverだけでもちょこちょこしたものに使えそうかな?

Perl用のBinlog APIとかあったなぁとふと思い出した。。


【2013/03/15 12:25】
資料を作ってふと気付いたんですが、mysqlbinlog --stop-neverしていると、
mysqlbinlogをCtrl+Cで切ってもコネクションが残存してしまう。
Bugs上げてみた。。

http://bugs.mysql.com/bug.php?id=68681

0 件のコメント :

コメントを投稿