自宅サーバ ~バックアップ~

データファイルのバックアップは、pdumpfsとpdumpfs-cleanを使用して差分バックアップ&世代管理しながら取っていくことにする。

参考:Ubuntu/pdumpfsで世代別バックアップ

まずは、apt-get で pdumpfs をインストール。使い方は簡単。
pdumpfs [バックアップ元ディレクトリ] [バックアップ先ディレクトリ]
すると、バックアップ先ディレクトリに年/月/日のディレクトリが構築され、その中に差分バックアップが作られていくとのこと。

次に、pdumpfs-clean。pdumpfsが取ったバックアップから古いものを削除して行ってくれるもの。
詳細は本家サイトへ→pdumpfs-clean

wget & chmod で pdumpfs-clean を /usr/local/sbin/ にインストール。使い方は簡単。
cd /usr/local/sbin
sudo wget http://tach.arege.net/software/pdumpfs-clean/pdumpfs-clean
sudo chmod 755 pdumpfs-clean
pdumpfs-clean [バックアップ先ディレクトリ]
すると、バックアップ先ディレクトリの古い日付のものを削除します。
デフォルトでは、最近7日分、毎週日曜日を6週間分、毎月1日を6か月分、毎年1月1日を2年分残します。
pdumpfs-clean --keep 5Y12M18W14D [バックアップ先ディレクトリ]
とすると、最近14日分、毎週日曜日を18週間分、毎月1日を12か月分、毎年1月1日を5年分残します。

さて、最後にMovable Typeで使っているPostgreSQLのデータベースをバックアップ。
世代管理まで行うスクリプトを書いてます。
#/bin/sh

##################################################
# PostgreSQL database backup script
#
# In this script, pg_dump command execute by "postgres" user
# Dump to DB_NAME.YYMMDD.dump
# Delete expired dump file
# Output log file.
##################################################

##################################################
# Settings
PG=/var/lib/postgresql/
PGDATA=$PG/8.3/main/
PGBIN=/usr/bin
PGLIB=/usr/lib
PATH="$PATH":$PGBIN
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":$PGLIB
export PGLIB=$PGLIB
export PGDATA=$PGDATA

# space separated value: databases and backup directories (full path)
DB_NAMES="movabletype"
BAK_DIRS="/backup/postgresql/daily"
WK_DIR=$PG

# log file path
LOG="/root/pg_dump_daily.log"

# number of backup file
BAK_NUM=15
##################################################

##################################################
# Main routine
TODAY=`date +%Y%m%d`

echo "@@@ Start Database Backup [ `date +%Y/%m/%d` ] @@@" | tee -a $LOG

# backup each "DB_NAMES"
for DB_NAME in $DB_NAMES
do
CNT_DIR=1
CP_SRC=""
CP_DST=""

# backup to each "BAK_DIRS"
for BAK_DIR in $BAK_DIRS
do
if [ $CNT_DIR -eq 1 ]; then

# create dump command
COM="pg_dump -S postgres -Fp $DB_NAME"
if [ $DB_NAME = "ALL" ]; then
COM="pg_dumpall -S postgres"
fi

# execute dump command
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] $COM [start]" | tee -a $LOG
DUMP_FILE_PATH=$WK_DIR/$DB_NAME.$TODAY.dump
su -l postgres -s /bin/sh -c "$PGBIN/$COM > $DUMP_FILE_PATH | tee -a $LOG"
mv $DUMP_FILE_PATH $BAK_DIR
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] $COM [done]" | tee -a $LOG
CP_SRC=$DUMP_FILE_PATH
else
# copy dump file to other BAK_DIRS
CP_DST=$BAK_DIR/$DB_NAME.$TODAY.dump
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Copy dump file to $BAK_DIR [start]" | tee -a $LOG
cp $CP_SRC $CP_DST | tee -a $LOG
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Copy dump file to $BAK_DIR [done]" | tee -a $LOG
fi

# delete old backup files
LS=`ls -r $BAK_DIR/$DB_NAME.*.dump`
CNT=1
for FILE in $LS
do
if [ $CNT -gt $BAK_NUM ]; then
rm -f $FILE | tee -a $LOG
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Delete expired dump file [$FILE]" | tee -a $LOG
fi
CNT=`expr $CNT + 1`
done

CNT_DIR=`expr $CNT_DIR + 1`
done

done
echo "@@@ Finish @@@" | tee -a $LOG
##################################################

Settings セクションを書き換えて、火曜0時~日曜0時に取る分(上記スクリプトそのまんま。daily。)と月曜0時に取る分(「daily」を「weekly」に変更したもの。weekly)を作ります。
PGなんとかというPostgreSQLの環境変数はそれぞれの環境に合わせて変更してください。
DB_NAMESパラメータにバックアップ対象のデータベース名をスペース区切りで入力します。
BAK_DIRSパラメータにDB_NAMESに指定したデータベースに対応するバックアップ先ディレクトリをスペース区切りで入力します。
BAK_NUMパラメータで指定した日数分が保持されます。

ここまでのバックアップ処理を crontab -e で登録。
0  0 * * 1   pg_dump_weekly.sh
0  0 * * 2-6 pg_dump_daily.sh

0  1 * * *   pdumpfs-clean /backup/etc/
5  1 * * *   pdumpfs-clean /backup/home/
15 1 * * *   pdumpfs-clean /backup/mail/
30 1 * * *   pdumpfs-clean /backup/samba/

0  2 * * *   pdumpfs /etc/ /backup/etc/
15 2 * * *   pdumpfs /home/ /backup/home/
0  3 * * *   pdumpfs /data/ /backup/data/


以上。