LinuxのファイルやDB情報を自動でバックアップ&世代管理するためのシェルスクリプト

例えば社内でLinuxサーバを立ち上げ、ファイルサーバやWebサーバなどとして使用している場合、できれば毎日バックアップを取得しておきたいですよね。

でも、バックアップファイルは無尽蔵に作られてしまうと容量が心配なので、世代管理も一緒に行いたい!

そんなときに便利かもしれないシェルスクリプトを作ってみたので、メモメモ。

バックアップを取得する処理

いきなりですが、バックアップファイルを作成して世代管理するまでのシェルスクリプト。

#!/bin/bash

# --- バックアップを何日分残すか
PERIOD="+7"

# --- バックアップ対象ディレクトリ
TARGET_DIR="
home/user/backup_dir1/
home/user/backup_dir2/
home/user/backup_dir3/
";

# --- バックアップ対象DB名
DB_NAME="data_base_name"


PATH=/usr/local/sbin:/usr/bin:/bin
DATE=`date +%Y%m%d`

# --- バックアップ先
BACKUP_DIR=/backup
# --- バックアップファイル名プレフィックス
BACKUP_PREFIX=${BACKUP_DIR}/linux_backup_
# --- バックアップファイル名サフィックス
BACKUP_SUFFIX=".zip"


# --- バックアップファイル名
BACKUP_FNAME=${BACKUP_PREFIX}${DATE}${BACKUP_SUFFIX}

# --- バックアップ先がなければ作成する
[ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR}

# --- バックアップ処理
cd /
zip -r ${BACKUP_FNAME} ${TARGET_DIR} 1> /dev/null

# --- MySQLのダンプとバックアップファイル作成
ROOTPASS="db_rootuser_password"
SQL_FNAME=${BACKUP_DIR}/mysql_${DB_NAME}_${DATE}.sql
mysqldump --events -u root -p${ROOTPASS} ${DB_NAME} > ${SQL_FNAME}
zip -m ${BACKUP_FNAME} ${SQL_FNAME}

# --- バックアップファイルの世代管理
find ${BACKUP_DIR}/*.zip -type f -daystart -mtime ${PERIOD} -exec rm {} \;

# --- バックアップファイルを転送
SYNC_PATH="//192.168.1.250/backup%5flinux"
rsync -av --chmod=Da+rwx,Fa+rw --delete /backup/ rsync:${SYNC_PATH}

シェルスクリプトの説明

バックアップファイルを何世代まで残すか(=何日分残すか)の指定は、

PERIOD="+7"
の数字を変更します。+7を+14とすれば14世代(=14日)分保存します。

バックアップの対象とするディレクトリは、

TARGET_DIR="
home/user/backup_dir1/
home/user/backup_dir2/
home/user/backup_dir3/
";
の部分で指定しています。1行1ディレクトリを指定します。

バックアップの対象となるデータベースは、

DB_NAME="data_base_name"
で指定しています。バックアップを行いたいデータベース名を指定します。

バックアップファイルを置く場所(バックアップファイル転送先と同期を行うディレクトリ)は、

BACKUP_DIR=/backup
で指定しています。権限等にご注意ください。

データベースのバックアップを行うために、MySQLのルートユーザーパスワードを

ROOTPASS="db_rootuser_password"
で指定しています。ご自分の環境に合わせて書き換えてください。

バックアップファイルの転送先は、

SYNC_PATH="//192.168.1.250/backup%5flinux"
で指定しています。ご自分の環境に合わせて書き換えてください。

注意点

見ての通り、特にエラー処理を行っていません。バックアップファイルを置くためのディレクトリが存在していなかったり、書き込み権限がない場合は、エラー終了すると思います。

バックアップ対象ディレクトリやデータベースについてもチェックを行っていないので、エラーが発生すれば処理は中断するでしょう。

cronなどに登録して毎日実行させる前に、必ず何度かテストを行っておいた方がいいです。テストで正常にバックアップできていれば、cronに登録して定期実行しても大丈夫、のはず。

あとは、バックアップ先の残容量には気を付けて!

初稿:2020年2月13日