データベースを定期バックアップ

仕様

  • DB データはダンプして圧縮 ( mysqldump と tar )
  • 1 つの sh で複数 DB をバックアップ ( 入力引数で DB 判別 )
  • 1 日 1 回の定期バッチでのバックアップ ( cron )
  • 一定期間過ぎたバックアップは削除 ( ファイル削除と日付処理 )

実装方法

下記ファイルを用意し起動 sh を cron 実行する。

  • cron_backup_db.sh ・・・ 起動 sh 。cron から起動される sh 。DB 数だけ実行 sh を処理する。
  • backup_db_one.sh ・・・ 実行 sh 。1つの DB をバックアップする sh 。
  • rm.php ・・・ heteml では cron にて rm コマンドが実行できないため、php で補う。

backup_db_one.sh 内容

  • DB バックアップの設定値、引数から DB 判別
  • ディレクトリーを移動して、そこで作業
  • データベースをダンプ
  • アーカイブと圧縮
  • 一時的な sql ファイルを削除
  • ローテーション処理

DB バックアップの設定値

(バックアップバッチ以外で使用する)共通ディレクトリーなどの設定値を別ファイル config.conf にし、読み込む。

# config.conf
tools_dir=${HOME}/sample-tools # サンプル sh を実行するディレクトリー
bkup_base_dir=${HOME}/sample-backup # バックアップデータを格納するディレクトリー
入力パラメーター
第 1 引数 DB 名
第 2 引数 DB ユーザー名
第 3 引数 DB パスワード
第 4 引数 DB ホスト
設定値
target_db_name 入力パラメーター第 1 引数 (=DB 名)
target_db_user 入力パラメーター第 2 引数 (=DB ユーザー名)
target_db_pass 入力パラメーター第 3 引数 (=DB パスワード)
target_db_host 入力パラメーター第 4 引数 (=DB ホスト)
bkup_days 保存期間で、この日数より前のデータは削除される。
today sh が起動された日にち。「_20140514」
past_date 保存期間を過ぎた日
bkup_dir バックアップデータを格納するディレクトリー。DB ごとにディレクトリーを分ける。
sample-backup/db/_sample-dbname
sql_file SQL ダンプしたフィアル、日にちごと。圧縮後削除する。
_sample-dbname_20140514.sql
bkup_file バックアップファイル。SQL を圧縮 ( TAR 形式 + GZIP 形式 ) したファイル。一定期間保管する。
_sample-dbname_20140514.sql.tar.gz
bkup_file_past 削除対象となるバックアップファイル。

コード全体

DB データをダンプ

7.11. mysqldump — データベースバックアッププログラム
http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html

ファイル削除

heteml では cron にて rm は使えないので、代わりに削除用の php を作る。

参考 : cronで rm や wget 、find コマンドは使えますか?
http://heteml.jp/support/faq/2085.html
rm.php を作成し、sh と同ディレクトリーに配置。要権限付与。

cron 設定

サイトへのアクセスが一番少ない朝4時に行うこととして、cronに登録。

cron の設定名 DB Backup 毎朝4時
cron ファイル名 cron_backup_db.sh
時間指定 0 4 * * *

ファイルをアップし、実行できるように権限付与

# コマンド実行
$ chmod 700 cron_backup_db.sh
$ chmod 700 backup_db_one.sh

cron_backup_db.sh 内容

cron から起動する sh

# cron_backup_db.sh
# 引数に DB 情報を渡す。
${tools_dir}/backup_db_one.sh sample-dbname sample-dbuser sample-dbpass sample-dbhost
更新日:
作成日: