Nov 19, 2008

バックアップの自動化の続き

LVMを使って460GBほどの領域を確保して/backupにマウントした所までやったので、その続き。

バックアップ対象は色々あるんだけど、大まかに言って3種類ある。

  • ファイル(ディレクトリ)丸ごと
  • データベースのダンプファイル
  • cronの設定

これらのバックアップ対象を、日付の名前を付けたディレクトリの中に(圧縮して)コピーすると同時に1ヶ月以上前のバックアップは自動で削除する(=30世代のバックアップを取る)、というシェルスクリプトを1日1回自動で走らせる、というのが最終目標です。Googleであちこち検索して回って、コマンドの使用例をコピペしまくった。

作業用ディレクトリとその日のバックアップディレクトリの作成はこんな風に書いた。

#!/bin/sh

destparentdir=/backup
destdir=${destparentdir}/`date +%Y-%m-%d`

mkdir $destdir

ファイル(ディレクトリ)のバックアップはtarコマンドを使う。「j」オプションでbzip2形式を指定して圧縮してみる。

tar cjf $destdir/svn/hooks.tar.bz2 /var/svn/repos/hooks

データベースのダンプは、Subversionならこんな感じになった。

svnadmin dump /var/svn/repos/ > $workdir/dump
tar cfj $destdir/svn/dump.tar.bz2 $workdir/dump
rm $workdir/dump

ダンプを吐く端から圧縮するというやり方が分からなかったので、一度作業ファイルを出力してから圧縮してみた。

svnadmin dump /var/svn/repos/ | bzip2 > $destdir/svn/dump.bz2

bzip2をパイプで繋げて、ダンプが吐かれるそばから圧縮。MySQLのデータベースの場合はsvnadminではなくmysqldumpコマンドを使う。

cronの設定の出力は、こう。

crontab -u tdiary -l > $destdir/crontab-tdiary

会社サイトのブログ部分の自動出力はtdiaryという名前のユーザの自動処理になっているので、こうなる。

最後、30日以上前のバックアップを消す処理はこう書いた。

BACKUP_DAYS=30
...(略)...
find ${destparentdir}/ -ctime +$BACKUP_DAYS -type d -maxdepth 1 -print0 | xargs -0 rm -r -f
...(略)...

これで、日付が30日より前のバックアップディレクトリは自動削除されるようだ。(※この処理は新しいバックアップを作る処理よりも前に書くのが望ましい。そうでないと、ディスクがいっぱいになってしまう場合があり得るから。まぁ、それも根本的な対策にはなってないんだけど……)

-maxdepth 1 を付けないと、下層のファイルから削除されるせいで上位ディレクトリの更新日が新しくなってしまい、削除されるべき古いバックアップが消えなくなってしまう。これに気付くのにだいぶかかってしまった。あと、ここでは-print0でNULL文字区切りで検索結果をパイプに出力して、xargs -0 rm -r -fで受け取って一度にファイルを削除するようにしてある。

このファイル(今の置き場所は /backup/backup.sh )のシンボリックリンクを/etc/cron.daily/以下に作成(sudo ln -s /backup/backup.sh /etc/cron.daily/baskup)した。これで、root権限でこのスクリプトが1日1回自動的に実行されるはずなんだけど……とりあえず明日どうなってるかまた見てみよう。

追記。どうやらタスク自体は実行されてるようなんだけど、実行されてる時刻が設定と違うような…… /etc/crontab に書かれた /etc/cron.daily/ 以下のタスクの実行時刻は22時なのに実際には翌日7時から動いてるみたい。9時間差ってことはUTCとJSTのずれっぽいんだけど、どこをどうすれば直るのか分からない。まあ今の所特に支障があるわけでもないようだし別にいいか……(←ひどい)

2009年1月5日追記。正月明けて見てみたら古いバックアップが自動削除されてなかった……しょうもないミスでした。/backup/ 以下を検索しないといけないのに、/backup/最新のバックアップディレクトリ/ の中を検索してた。そりゃ古いファイルが見つかるわけがないです……

2009年3月19日追記。スクリプトを/backup以下に置いてcronにはシンボリックリンクを……という風にしてたせいで、スクリプトの編集から30日後のタイミングで古いバックアップと一緒にバックアップ用スクリプト自体まで消えてしまってました(ぉぃ)。アホス。これは置き場所を変更して解決しました。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能