背景
最近監視システムのMySQLのDBバックアップができていないことがわかったので、ちゃんとバックアップして別のサーバで保管したいと考えました。
準備
今回は、別のサーバ側にマウントしてマウント先に直接バックアップを行います。
そのため、事前にDBがあるサーバ側にマウントポイント(ディレクトリ)を作成する必要があります。今回は/bkがマウントポイントにあたります。
コード
#!/bin/sh
# DBのバックアップ先のサーバ(XXX.XXX.XXX.XXX)をマウント
mount -t nfs XXX.XXX.XXX.XXX:/mnt/XXXXX /bk
# マウントが失敗したらメールで通知を飛ばす。
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t nfs_mount "ALERT Failed NFS_MOUNT"
exit $EXITVALUE
fi
# バックアップ処理を走らせる
# XXXXがDBのユーザ名、YYYYYYYYがパスワード、db_nameがDB名
mysqldump -uXXXX -pYYYYYYYY --single-transaction db_name | gzip > /bk/mysqldump_`date +"%Y%m%d"`.sql.gz
# バックアップ失敗したらメールで通知を飛ばす
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
echo "DBのバックアップに失敗しました。" | mail -s "mysqldumpによるバックアップ失敗" -r aaaaaa@hogehoge.hoge bbbbbbb@hogehoge.hoge
exit $EXITVALUE
fi
# 3週間前のDBは削除
find /bk/ -mtime +21 -exec rm -f {} \;
# マウント解除
umount /bk
# アンマウント失敗したらメールで通知を飛ばす
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t nfs_unmount "ALERT Failed NFS_UNMOUNT"
exit $EXITVALUE
fi
補足
あとはこれをcronで仕込めば自動で勝手バックアップしてくれます。
なお、バックアップ及びアンマウント失敗時にはメールを飛ばすように設定しています。また、世代管理として、3週間前のDBは自動で削除するコマンドも仕込んでいます。