古いBackupファイルの削除

運用で楽したい。

1. 1つバックアップしたら一番古いのを1つ削除する

最近一番使ってるパターンです。

世代を増やしたいときは一番古いバックアップを適当な名前でコピーする。

世代を減らしたいときは一番古いバックアップを削除する。

プログラムや設定ファイルを修正せずに世代数を変更できるので運用が楽ちんです。

注意点はバックアップが失敗した時にファイル削除されないようにすること。サンプルはその辺をサボってるので注意してください。

Log::info('*** BACKUP START ***');

$BK = '/backup_hoge'; //バックアップ先
$DT = date('Ymd-Hi'); //実行日時


Log::info('  * BACKUP DB *');
shell_exec("pg_dump -U postgres -f {$BK}/hoge_db_{$DT}.pgbk");
shell_exec("gzip {$BK}/seer_db_{$DT}.pgbk");


Log::info('  * BACKUP FILES *');
shell_exec("tar -zcvf {$BK}/hoge_files_{$DT}.tar.gz -C /hoge/files > {$BK}/last_backup_files.txt 2>/dev/null");


Log::info('  * DELETE OLD BACKUP *');
self::deleteFile("{$BK}/hoge_db_*.pgbk.gz");
self::deleteFile("{$BK}/hoge_files_*.tar.gz");


Log::info('*** BACKUP END ***');


private function deleteFile($pattern){
    $ls = shell_exec("ls {$pattern}");
    if ($ls != ''){
        $files = explode("\n", $ls);
        shell_exec(   "rm {$files[0]}");
        Log::info("    rm {$files[0]}");
    }
}

2. nヶ月前のファイルを削除する

指定月のファイルを削除します。(指定月"だけ"です、指定月"より前"じゃないので注意)
複数ファイルを削除できます。

「毎月15日に実行して先々月のバックアップを全部削除」みたいな感じで使います。

$TGT_DIR = '/backup_hoge';                       //対象ディレクトリ
$YM      =  date('Y-m', strtotime("-2 month"));  //年月

Log::info('*** DELETE OLD BACKUPS : start ***');

self::deleteFiles("{$TGT_DIR}/files_{$YM}*");
self::deleteFiles("{$TGT_DIR}/db_{$YM}*");

Log::info('*** DELETE OLD BACKUPS : end ***');


private function deleteFiles($pattern)
{
    Log::info("rm {$pattern}");
    Log::info(shell_exec("ls {$pattern}"));

    return shell_exec("rm {$pattern}");
}