データベースを定期バックアップ
仕様
- 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