参考: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 [バックアップ先ディレクトリ]
さて、最後に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
##################################################
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/
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/
以上。