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"