3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Linux)バックアップシェルスクリプトで世代管理2

(Linux)バックアップシェルスクリプトで世代管理1で、世代管理機能付きのバックアップシェルスクリプトを書きました。

しかし、いざ運用を始めると数ヶ月前のデータがほしいなんてことも想定されます。

ということで、下記のようなバックアッププランを立てました。

・日次バックアップ(直近7日間保存)

・週次バックアップ(直近3週間分保存)

・月次バックアップ(直近2ヶ月間保存)

具体的に、日次バックアップは(Linux)バックアップシェルスクリプトで世代管理1スクリプトで cron を使い毎日動かします。

週次バックアップと、月次バックアップは下記スクリプトを使い、日次バックアップのアップの最新版を各週次・月次バックアップ先にコピーし古いファイルは削除するようにしました。(なお、今回古いファイルの削除はファイルの更新日時から判断するようにしています。)

スクリプトの引数で、週次(week)か月次(month)か判断するようにしています。

スクリプトファイルは、(Linux)バックアップシェルスクリプトで世代管理1スクリプトと同じディレクトリに保存します。

ファイル名は、/root/sh/bkup_cp.sh とします。

#! /bin/sh

#このスクリプトのパスを取得

MYPATH=$(cd $(dirname $0);pwd)

#週次バックアップ先

TO_DIR_WEEK="/var/backup/week/"

#週次で更新日時が22日より古いデータは削除対象

DAYAGO_WEEK="22"

#月次バックアップ先

TO_DIR_MONTH="/var/backup/month/"

#月次で更新日時が61日より古いデータは削除対象

DAYAGO_MONTH="61"

#bkup.shで使っているバックアップ対象バックアップ先設定ファイル(bksrc.dat)を使用

cat ${MYPATH}/bksrc.dat | grep -v \# | while read BKSRC_DIR BKUP_DIR

do

#バックアップ先から、指定したバックアップファイルの最新版を取得

FROM_FILE="`ls -lt ${BKUP_DIR}* | head -n 1 | gawk '{print $9}'`"

#週次、月次のバックアップ先と、何日間のデータを残すか設定

case "$1" in

"week" ) TO_DIR=$TO_DIR_WEEK

DAYAGO="+${DAYAGO_WEEK}"

;;

"month" ) TO_DIR=$TO_DIR_MONTH

DAYAGO="+${DAYAGO_MONTH}"

;;

esac

#更新日時が指定より古いファイルを削除

find $TO_DIR -mtime $DAYAGO -type f -exec rm -f {} \;

#コピー

cp ${FROM_FILE} ${TO_DIR}

done

cron の設定は下記のようになります。

#日次バックアップ

0 4 * * * /root/sh/bkup.sh

#週次バックアップ(日曜)

0 5 * * 0 /root/sh/bkup_cp.sh week

#月次バックアップ(毎月一日)

0 6 1 * * /root/sh/bkup_cp.sh month

ちなみに、テストでファイルの日付を変更する必要がありますが、touchコマンドを使うとmtime が変更できるようです。

mtimeを2011/4/11 1:00:00 に変更

touch -t 201104110100.00 hoge.txt

atime,ctime,mtimeの確認は、stat コマンドを使えばいいようです。

# stat hoge.txt

File: `hoge.txt'

Size: 18 Blocks: 16 IO Block: 4096 通常ファイル

Device: fd00h/64768d Inode: 25624583 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2011-05-09 17:11:04.000000000 +0900

Modify: 2011-05-09 17:10:46.000000000 +0900

Change: 2011-05-09 17:10:46.000000000 +0900

参考:

【 更新日時を現在に変更する 】 - Linuxコマンド逆引き大全:ITpro

ファイルやディレクトリの最終更新日時を変更する - 試験運用中なLinux備忘録

ctimeは、内容か属性が修正された日時を指し、作成日時を指すのではない - 試験運用中なLinux備忘録