LoginSignup
2
4

More than 1 year has passed since last update.

cronで定期的にバックアップファイルを作る

Posted at

バックアップファイルを作る流れ

※保存期間は1ヶ月

  1. 先月分のバックアップファイルを削除
  2. n月1日にフルバックアップ
  3. フルバックアップした日にちを保管しておく
  4. 日次でフルバックアップに対して差分バックアップ

毎月1〜4を繰り返す

#!/bin/sh
#40 3 * * * cd /root/backup/;/root/backup/bkdb.sh;/root/backup/bkfile.sh // いつcronが動くかわかりやすくコメントアウト(crontab -l で確認)

// 変数の定義
DIRECTORIES=/var/www/hogehoge // tarコマンド実行時に指定するバックアップ元のディレクトリ
BACKUPDIR=/root/backup/file/ // tarコマンド実行時に指定するバックアップ先のディレクトリ
EXCLUDEOPTIONS='--exclude /var/www/hogehoge/cache --exclude /var/www/hogehoge/backup' // tarコマンド実行時に指定するバックアップ対象外のディレクトリ
TIMEDIR=/root/backup/file // 月次のフルバックアップに対して日次で差分バックアップを行う際に使用する日付データを入れるためのディレクトリ
LogFile=/root/backup/file/logs/log$(date +%y%m).txt // ログファイル
OldFiles="$BACKUPDIR"file$(date +%y%m --date='1 month ago')*.tar.gz // 先月分のバックアップファイル

date "+==%y%m%d %H:%M:%S==" >> $LogFile  // ログファイルに実行日時を出力(例:==210819 03:40:07==)

// 先月分のバックアップファイルが存在する場合、全て削除し、ログファイルに「[バックアップファイル名] Delete Old Files Success!」と書き込む。
// 先月分のバックアップファイルが存在しない場合、ログファイルに「[バックアップファイル名] No Old Backup File!」と書き込む。
if ls $OldFiles 1> /dev/null 2>&1;  
then
   rm -f $OldFiles >> $LogFile 2>&1
   echo "[$OldFiles] Delete Old Files Success!" >> $LogFile
else
   echo "[$OldFiles] No Old Backup File!" >> $LogFile
fi

DOW=`date "+%u"` // UFC時刻を取得する
DOM=`date "+%d"` // 年月日の日にちのみを取得する(1日の場合、01日となる形式で取得)
DA=`date "+%y%m%d"` // 年月日を取得する(1月1日の場合、01月01日となる形式で取得)
DAYM=`date "+%y%m"` // 年月日の年月のみを取得する(1月の場合、01月となる形式で取得)

// n月1日の場合、tarコマンドでフルバックアップファイルを作成し、差分バックアップのため作成日を保管しておく
// n月1日ではない場合、tarコマンドで差分バックアップファイルを作成(フルバックアップファイル作成日より新しいファイルが対象)
if [ $DOM = "01" ]; then 
        NOW=`date "+%Y-%m-%d %H:%M:%S"`// 変数NOWに年月日時分秒を定義

        echo "Monthly full backup" >> $LogFile // ログファイルに「Monthly full backup」と書き込む。
        echo $NOW > $TIMEDIR/full-date // 変数NOWをファイル/root/backup/file/full-dateに書き込む。
        tar czPf $BACKUPDIR/file$DA.tar.gz --exclude $EXCLUDEOPTIONS $DIRECTORIES // 後述※1
else
        echo "Incremental backup" >> $LogFile //ログファイルに「Incremental backup」と書き込む。
        tar czPf $BACKUPDIR/file$DAYM.$DOM.tar.gz $EXCLUDEOPTIONS $DIRECTORIES --newer "`cat $TIMEDIR/full-date`" //後述※2
fi

echo "==end==" >> $LogFile // ログファイルに「==end==」と書き込む。

tarコマンド

後述※1(フルバックアップするコマンド)

tar czPf $BACKUPDIR/file$DA.tar.gz --exclude $EXCLUDEDIRS1 $EXCLUDEDIRS2 $DIRECTORIES
  • オプション確認
    • c:新しいバックアップを作成する
    • z:バックアップをgzip形式で圧縮する
    • P:ファイル名から先頭の「/」を取り除かない
    • f:バックアップファイル名を指定する
    • exclud:除外したいファイル、ディレクトリを指定する

除外オプションを複数使う際は、除外数分--excludeを書く必要がある

tar czPf 作成するアーカイブファイルPATH -exclude 除外ファイルまたはディレクトリのPATH アーカイブ対象ディレクトリ

後述※2(差分バックアップするコマンド)

tar czPf $BACKUPDIR/file$DAYM.$DOM.tar.gz $EXCLUDEOPTIONS $DIRECTORIES --newer "`cat $TIMEDIR/full-date`"
  • newer 指定した日付より新しいファイルだけを保存する(日付の代わりにファイルを指定することも可能。この場合、指定したファイルより新しいファイルだけが対象になる)
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4