ファイルのローテーションについて

0. 概要

ログやDBのバックアップをタイムスタンプをつけてローテーションをしたいことがあると思います。
今回はその際に使うスクリプトの実例を含めて解説していきたいと思います。

1. 想定環境

今回は「DBのダンプデータを毎日取得して、過去1週間分を保存しておきたい」という要望を想定します。
またサーバーはubuntu18.04を想定しています。

2. コード紹介

では早速実例を出して紹介していきたいと思います。

#!/bin/bash

#バックアップ先
BACKUP_DIR="/mnt/S3/db_backup"
# その他
TODAY=`date +%Y%m%d`
PASTDAY=`date -d "7 day ago" +%Y%m%d`
#当日のバックアップを取得
mkdir "$BACKUP_DIR"/"$TODAY"
mongodump -o "$BACKUP_DIR"/"$TODAY"
#過去のバックアップデータの消去
if [ -d "$BACKUP_DIR"/"$PASTDAY" ]; then
    rm -rf "$BACKUP_DIR"/"$PASTDAY"
fi

・6行目
dateコマンドは後ろに表示形式を指定することで、任意の形で日付を出力できます。(unixタイムなども可能です)
今回はわかりやすくyyyymmddの形を設定しています。

・7行目
dateコマンドはオプション-dを付与することによって、日付を現時刻から任意の数ずらすこともできるので、今回は”7 day ago”と指定することで7日前の日付を取得しています。

・9行目
ここで、今日付のディレクトリを作成します。

・10行目
ここには実際にやりたいことを記載します。
今回はmongoDBのバックアップを取得し、先程作成した本日の日付のディレクトリに格納しています。

・13行目
7行目で取得した日付のディレクトリが存在した場合、そのディレクトリごと削除するようになっています。

3. cronに仕込む

上記のスクリプトを/home/ubuntu/db_backup/dairy_backup.shと保存したとすると、そのスクリプトを定期的に実行するcronを登録する必要があります。

crontab -e
# 下記行を追加
10 0 * * * /home/ubuntu/db_backup/dairy_backup.sh

上記の場合は毎日、午前0時10分にスクリプトが実行されます。

4. まとめ

こうする事によって、最初の6日間は7日前のディレクトリが存在しないので、次々とバックアップファイルが作成されていきます。
そして、7日目以降は新しいバックアップファイルが取得されるたびに古い方から自動的に削除されていき、バックアップファイルでサーバーがいっぱいとなってしまうことを防ぐことができます。

yuzuki
未整理記事