[linux][bash] 日次でデータベースのバックアップを取るよ

[linux][bash] 日次でデータベースのバックアップを取るよ

ホッシーが卒業 しちゃって心にぽっかり穴が開いてしまったような気分の nakamura です。みなさん、こんちには。

バックアップ・・・、それはいざという時の魔法の言葉・・・。でもきちんと取れてなかったり、リストアする時の事まで考えてなかったりすると逆に痛い目見ちゃう事もしばしば。という事で今回は、僕がいつもやってるデータベースのバックアップ方法を晒してみます。

とりあえず貼っつけておく

いつも使ってるスクリプトはだいたいこんな感じ。cron で一日一回走らせています。

#!/bin/bash

# 認証情報
DBUSER="root";
DBPASSWD="password";

# バックアップ先ディレクトリ /var/backup/example.com/mysql/20120327 みたいな感じになります。
BAKDIR="/var/backup/`hostname -s`/mysql";
TODAYS_BAKDIR="$BAKDIR/`date +%Y%m%d`";

# DB一覧
DATABASES=`mysql -NB -u$DBUSER -p$DBPASSWD -e 'show databases'`;

# バックアップ先がなければ作成
[ ! -d $TODAYS_BAKDIR ] && mkdir -p $TODAYS_BAKDIR;

# DB名でループ、ダンプ取得
for DB in $DATABASES; do
    mysqldump -u$DBUSER -p$DBPASSWD --opt --skip-lock-tables $DB | gzip > $TODAYS_BAKDIR/$DB.dump.sql.gz;
done;

# 7 日より古いバックアップは削除
find $BAKDIR -type d -mtime +7 -print0 | xargs -0 rm -rf;

※2012.03.28 mysqldump コマンドにちょびっとオプション追加しました。

ポイントとしては、

  • show databases で DB の一覧を取得する事で DB の追加、削除時等のメンテが不要
  • DB 毎にダンプファイルを分ける事でリストアが楽になる
  • 日毎にディレクトリを分けることで世代管理する

といった辺りでしょうか。mysqldump -A でも全体のダンプは取れますがそれだと MySQL 全体でひとつのダンプファイルになってしまい、特定の DB だけリストアしたい時など不便極まりないのであえてこういう回りくどいやり方をしています。

ちなみに

PostgreSQL だとこんな感じになると思います。(実際に使ってはいないので使われる方は慎重に)

#!/bin/bash

# 認証情報
DBUSER="postgres";

# バックアップ先ディレクトリ
BAKDIR="/var/backup/`hostname -s`/psql";
TODAYS_BAKDIR="$BAKDIR/`date +%Y%m%d`";

# バックアップ対象のデータベース
DATABASES=`psql -U $DBUSER -t -c 'select datname from pg_database'`;

# バックアップ先がなければ作成
[ ! -d $TODAYS_BAKDIR ] && mkdir -p $TODAYS_BAKDIR;

for DB in $DATABASES; do
    pg_dump -U $DBUSER $DB | gzip > $TODAYS_BAKDIR/$DB.dump.sql.gz;
done;

# 7 日より古いバックアップは削除
find ${BAKDIR} -type d -mtime +7 -print0 | xargs -0 rm -rf;

終わりに

mysqldump, pg_dump でバックアップって結構レガシーなやり方ですが、何だかんだ今後も使う場面はなくならないんだろうなぁと思ったりします。


横浜で働きたいプログラマ募集中です!!

photo
詳解 シェルスクリプト
Arnold Robbins Nelson H. F. Beebe 日向 あおい
オライリージャパン 2006-01-16

by G-Tools , 2012/03/27

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ