シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション

一部のサイトをCoreserverに移動したのを機に、バックアップ用のシェルスクリプトを見直しました。今回は、データベースの自動バックアップ&ローテーションを行うシェルスクリプトをメモを兼ねて紹介します。

ページ下部のようなシェルスクリプトを文字エンコーディングをEUC-JP、改行コードをLFで作成し、外部からアクセスできない場所に転送します。例ではシェルスクリプトを/virtual/ユーザー名/sh/ディレクトリに作成し、バックアップ先を/virtual/ユーザー名/backup/databases/ディレクトリとしています。

あとは、Cronにこのシェルスクリプトを登録し、1日に1回だけ実行されるように設定するだけです。

シェルスクリプトが実行されるたびに、指定したディレクトリにデータベースのダンプファイルを圧縮したtar.gzファイルが蓄積されていきます。「bk_days」で指定した日数分を超えると、自動的に古いバックアップファイルから削除されていきます。

バックアップはサーバー内に蓄積されていくので、定期的にローカルコンピューターにダウンロードしたり、別のサーバーにサーバー間コピーでバックアップのバックアップを作成するようにしましょう。サーバー自体に問題が発生した場合には、バックアップの意味がなくなってしまいます(経験済み)。

Coreserver以外のサーバーでも、大半のサーバーではディレクトリ名を変えるだけでそのまま使えると思います。

/virtual/ユーザー名/sh/backup_db.sh
#!/bin/sh

# ---------- 設定 ----------
# バックアップ元のデータベース
db_name=データベース名
db_pass=データベースのパスワード

# バックアップ先のディレクトリ・ファイル
bk_dir=/virtual/ユーザ名/backup/databases/
bk_file=$db_name

# 保存する日数
bk_days=90

# ---------- ファイル名を設定 ----------
# タイムスタンプを取得
ts_now=`date +%Y%m%d`
ts_old=`date "-d$bk_days days ago" +%Y%m%d`

# ファイル名を設定
file_temp=$bk_file.sql
file_backup=$bk_file.$ts_now.tar.gz
file_remove=$bk_file.$ts_old.tar.gz

# ---------- バックアップ処理 ----------
# バックアップ先のディレクトリに移動
cd $bk_dir
if [ $? != 0 ]; then
echo "Backup directory does not exist."
exit 1
fi

# データベースをダンプ
/usr/local/mysql/bin/mysqldump $db_name -u $db_name -p$db_pass --opt > $file_temp
if [ $? != 0 -o ! -e $file_temp ]; then
echo "Cannot dump database."
exit 1
fi

# アーカイブを作成
tar cfz $file_backup $file_temp
if [ $? != 0 -o ! -e $file_backup ]; then
echo "Cannot archive files."
exit 1
fi

# テンポラリファイルを削除
rm -f $file_temp

# ローテーション処理
if [ -e $file_remove ]; then
rm -f $file_remove
fi

exit 0