Skip to content

Record / Memo

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

仕様 DB データはダンプして圧縮 ( mysqldump と tar ) 1 つの sh で複数 DB をバックアップ ( 入力引数で DB 判別 ) 1 日 1 回の定期バッチでのバックアップ ( cron ) 一定

仕様

  • 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

Back to Discoveries