MySQLをロックしてほげほげするツール「mysqllock」を書いた
MySQLを使っていると書込みロックをかけてバックアップを取る、ってのは一般的だと思います。実際、標準添付の mysqlhotcopy や Xtrabackup もそういうことをやっています。
しかし、これらはいずれもロックの管理とバックアップ処理が密結合になっている(ですよね?)のが玉に瑕。
特にボリュームレベルのスナップショット機能を使ってバックアップを取る場合、スナップショットを取るためのコマンドは環境(LVM とか XenServer とか VMware ESXi とか...)によって異なるので、ロック管理とバックアップコマンドは疎結合にしておきたい。と思ったので、書くことにしました。というか、疎結合なのを探すより書いたほうが早かった。コードはこちら↓。
使い方は、以下のとおり。setlock 風のインターフェイスなので、慣れている人には簡単だと思います。
% mysqllock --help
Usage: ./mysqllock [options] cmd
Options: --user=db_user username (default: current user)
--password=pass password (default: none)
--host=db_host db host (default: 127.0.0.1)
--port=db_port db port (default: 3306)
--db=db_name database name (default: "mysql")
--before=stmt statement to execute before running the command
(default: "FLUSH TABLES WITH READ LOCK")
--after=stmt statement to execute after running the command
(default: "UNLOCK TABLES")
自作のバックアップツール(Kazuho@Cybozu Labs: リモートからXenのDomUとかLVMやファイルを差分バックアップするスクリプトを書いた)も、1行パッチをあてるだけで、テーブルロックをした状態でスナップショットを取ってから、バックアップを取れるようになりました。こんな感じで。
% SNAPSHOT_SIZE=5G BLOCKSIZE=65536 LVCREATE_PREFIX='bin/mysqllock --host=mysqld.local --user=root --password=XXXXXXXX' bin/blockdiff_backup backup-name bin/ssh_lvm_dump -z root@mysqld.local /dev/XXXXXXXX/XXXXXXXX
creating snapshot...
issuing lock statement: FLUSH TABLES WITH READ LOCK
Logical volume "lvm_dump" created
issuing unlock statement: UNLOCK TABLES
running: bin/ssh_blockdiff_dump -z "root@mysqld.local" "/dev/XXXXXXXX/lvm_dump"...
removing snapshot /dev/XXXXXXXX/lvm_dump...
Logical volume "lvm_dump" successfully removed
backup completed successfully
結論:djb++
Comments