Server バックアップ用 スクリプトを作成

June 6, 2026 – 10:24 am

先月末に、このサーバーのmedia(SSD)がクラッシュした後、復旧手続きを終えることができた。

復旧にあたっては、新たなMedia(HDD 1TB)を調達し、この上にOS:Almalinux10.2をインストールしたのち、かなりの部分について記憶をたよりに設定作業をおこなった。

同じような障害の発生に備えて、バックアップ用スクリプトを作成しておいたので記録しておく:

rsyncシステムミラーリング・スクリプト system_backup.sh
このスクリプトは、/ (ルート)全体を /mnt/backup/system_mirrorに同期

#!/bin/bash

# --- 設定 ---
SOURCE="/"
DESTINATION="/mnt/backup/system_mirror"
LOG_FILE="/var/log/rsync_backup.log"

# 1. バックアップ先がマウントされているかチェック(必須!)
if ! mountpoint -q /mnt/backup; then
    echo "$(date): Error - /mnt/backup is not mounted. Backup aborted." >> $LOG_FILE
    exit 1
fi

# 2. バックアップディレクトリの作成
mkdir -p $DESTINATION

# 3. rsyncの実行
# -a: 権限、所有者、タイムスタンプを維持
# -v: 詳細表示
# -X: 拡張属性(ACLやSELinux属性)を維持(AlmaLinuxには重要)
# --delete: 元で消えたファイルを先からも消す
# --exclude: 同期しないディレクトリを指定
echo "--- Backup Start: $(date) ---" >> $LOG_FILE

rsync -avX --delete \
  --exclude="/proc/*" \
  --exclude="/sys/*" \
  --exclude="/dev/*" \
  --exclude="/run/*" \
  --exclude="/tmp/*" \
  --exclude="/mnt/*" \
  --exclude="/media/*" \
  --exclude="/lost+found" \
  --exclude="/home/*" \
  $SOURCE $DESTINATION/ >> $LOG_FILE 2>&1

# 4. /home の中の特定のディレクトリだけ個別に追加(必要な場合)
# 例: /home/anacon と /home/yukichi をバックアップ
echo "--- Specific Data Sync ---" >> $LOG_FILE
rsync -avX -R --delete /home/./anacon $DESTINATION/home/ >> $LOG_FILE 2>&1
rsync -avX -R --delete /home/./yukichi $DESTINATION/home/ >> $LOG_FILE 2>&1
rsync -avX -R --delete /home/./yamasnet/test $DESTINATION/home/ >> $LOG_FILE 2>&1

echo "--- Backup Ended: $(date) ---" >> $LOG_FILE

データベース(mysql)ダンプならびにMaildirのバックアップ作成 backup_ssh.sh:

#!/bin/bash

#-------------------
# backup script (Improved)
#-------------------
# /mnt/ssd がマウントされているかチェック。されていなければ中止。
if ! mountpoint -q /mnt/ssd; then
    echo "Error: /mnt/ssd is not mounted. Backup aborted."
    exit 1
fi

# バックアップ対象
TARGETS="/home/yukichi/Maildir"

# 保存先 (より容量の大きい backup ディレクトリを推奨)
BACKUP_ROOT="/mnt/ssd"
SAVE_NAME="server_backup_$(date +%Y%m%d_%H%M)"
DB_DUMP_PATH="/tmp/dbdump.sql"

# 1. データベースのダンプ (先にtmpに作成)
# --single-transaction: サービスを止めずに整合性を確保
# --all-databases であれば、通常 root またはそれに準ずる権限で実行
/usr/bin/mysqldump --single-transaction --all-databases -u yukichi > $DB_DUMP_PATH
BACKUP_PATH="$BACKUP_ROOT/$SAVE_NAME.tar.gz"

# 2. まとめて圧縮 (cpを使わず、直接tar.gzを作成)
# -c: 作成, -z: gzip圧縮, -f: ファイル指定
# データベースのダンプファイルも一緒に含める
tar -czf "$BACKUP_PATH" $TARGETS > /dev/null

# 3. 一時的なダンプファイルを削除
rm -f "$DB_DUMP_PATH"

# 4. 古いバックアップの削除 (5日以上前のファイルを削除)
# -mtime +4 (修正日が4日より前 = 5日以上前)
find "$BACKUP_ROOT" -maxdepth 1 -type f -name '*.tar.gz' -mtime +4 -exec rm -f {} \;

echo "Backup completed: $BACKUP_PATH"

Post a Comment