小野マトペの業務日誌(アニメ制作してない篇)

はてなダイアリーの閉鎖をうけ、旧ブログ http://d.hatena.ne.jp/ono_matope/ から移行しました。続きは→ http://matope.hatenablog.com/

LVMスナップショットバックアップのためのシェルスクリプトを作った

今までmysqldumpを使ったデイリーバックアップを行っていたんですが、 いざ障害時に復旧しようとすると、SQLの実行のための時間がかかりすぎる、MERGEテーブルに対応していない(のでSQLsedで書き換えるハメになった)等の理由から、LVMスナップショットバックアップに移行することにしました。


というわけでさっき

  • /dev/ssdvg/lv01 を/var にマウントした環境において
  • MySQLのデータディレクトリ /var/lib/mysql/favotter/ をLVMスナップショットバックアップする

というスクリプトを書きました。何かの参考にするために上げておきます。LV消したりとか危ない事を自動化しているので、これを使ったり参考にしたりした事によるいかなる損害も保障しません。また、このスクリプトを実行する前に、バックアップしたいVolumeGroup上に、スナップショット用の空き容量(今回は1GB)を作る必要があります。


やってること

  1. MySQLをFLUSH TABLEする(書き込みバッファの内容をファイルに書き出す)
  2. /dev/ssdvg VolumeGroupのlv01 Logical Volumeのスナップショットを /dev/ssdvg/lvSnapに1GBで作成
  3. /var/lib/mysql/favotterを /バックアップ先ディレクトリ/<日付>-にコピーする
  4. /dev/ssdvg/lvSnap LVを削除する
  5. コピーをtar.gz圧縮する。
#/usr/bin/sh
DATE=`date '+%Y-%m-%d-%a%H:%M:%S'`;
SRC_LV="/dev/ssdvg/lv01";
SNAP_LV="/dev/ssdvg/lvSnap";
SNAP_SIZE=1G;
DB_NAME="favotter";
DB_PATH="lib/mysql/$DB_NAME/";
DB_PASSWORD="<your db password>";

DEST_PATH="/home/matope/Documents/favotter/dbbackup/hotcopy/";
DEST_FULL=$DEST_PATH$DATE-$DB_NAME;

sudo mkdir /mnt/snap;
sudo /sbin/modprobe dm_snapshot;
sudo /sbin/lsmod | grep snapshot;

mysqladmin -u root -p$DB_PASSWORD flush-tables;
sudo /usr/sbin/lvcreate -s -L $SNAP_SIZE -n lvSnap $SRC_LV;
sudo mount $SNAP_LV /mnt/snap;
sudo cp -rpv /mnt/snap/$DB_PATH $DEST_FULL;
sudo umount /mnt/snap;
sudo /usr/sbin/lvremove $SNAP_LV --force;
sudo tar -cvzf $DEST_FULL.tar.gz $DEST_FULL;

この本を参考にしました。すごく実用的でおすすめです。ふぁぼったーもめきめき高可用性ゲットやでー

Linux-DB システム構築/運用入門 (DB Magazine SELECTION)

Linux-DB システム構築/運用入門 (DB Magazine SELECTION)