シェルスクリプトを使ってcronで定期的にSQLをバックアップさせる方法

データベースのバックアップは、共用サーバーで運用していたころはphpmyadminからエクスポートして手動でおこなっていました。
しかし、VPSに移行してから同じようにやっているのも勿体ない。せっかく自由にできるのだから、cronで自動的にバックアップさせるようにできないのかなと思って調べてみました。
参考サイトは「シェルスクリプトで自動的にデータベースをバックアップ」です。
というかスクリプトはそのまんま使わせてもらいました。僕の場合 crontab -e ではなく cron.daily フォルダにぶち込むタイプだったのでそこが若干違うだけです。crontab使っている人は参考サイトをご覧ください。

1. バックアップファイルを保存するディレクトリを作成

# mkdir -p /var/www/backup

2. cron用のシェルスクリプトの作成する

/etc/cron.daily に backupsql というシェルスクリプトを作成。

# vi /etc/cron.daily/backupsql

エディタで開かれるので以下を記述して保存する。
最後に書かれている「bk_mysql データベース名 パスワード 7 /var/www/backup」の箇所のデータベース名とパスワードはご自身のものに差し替えてください。

#!/bin/sh

# バックアップする関数を定義
function bk_mysql() {
  # 引き数の覚え書き
  # $1 : database name(データベース名)
  # $2 : password(データベースのパスワード)
  # $3 : period(保存期間)
  # $4 : backup path(バックアップファイルを保存するディレクトリ)

  # 現在年月日を「%y%m%d」の形(yymmdd)で取得
  CUR_DATE=`date +%y%m%d`

  # 保存期間で指定した日数前の年月日を取得
  OLD_DATE=`date --date "$3 days ago" +%y%m%d`

  # MySQLから指定したデータベースをダンプする
  mysqldump --opt --password=$2 $1 > $4/${CUR_DATE}_$1.sql

  # バックアップしたファイルを管理者だけ触れる権限にする
  chmod 600 $4/${CUR_DATE}_$1.sql

  # 指定した保存期間前のバックアップファイルを削除する
  rm -f $4/${OLD_DATE}_$1.sql
}

# 関数bk_mysql に引き数($1〜$4)を渡して実行します。
bk_mysql データベース名 パスワード 7 /var/www/backup

エスケープキーを押して、:wq で保存。

3. 作成した backup_mysql.sh に実行権限を与える

# chmod 700 /etc/cron.daily/backupsql

以上で、毎日cronが実行され /var/www/backup フォルダにsqlがバックアップされるようになる。

4. 試しに実行してみる

作成したシェルスクリプトが本当に動いているか一日待つのは面倒なので、今すぐ実行してみてバックアップできているか確認したい場合には以下のコマンドを実行する。

# cd /etc/cron.daily
# ./backupsql