Linuxサーバー管理完全攻略 第9編:バックアップと復旧戦略
Linux Server Administration Complete Guide Part 9
Linuxサーバー管理完全攻略シリーズ
第8編:ログ管理 | 第9編:バックアップと復旧 (現在) | 第10編:セキュリティ強化
はじめに:バックアップなしにデータなし
データ損失はいつでも発生し得ます。ハードウェア障害、人的ミス、セキュリティ侵害、自然災害など、様々な原因に備えるバックアップ戦略はサーバー運用の必須です。
1. バックアップ戦略
1.1 3-2-1バックアップルール
# 3-2-1ルール
- 3つのデータコピーを維持
- 2つの異なる保存媒体を使用
- 1つはオフサイト(遠隔地)に保管
1.2 バックアップの種類
# フルバックアップ
- 全データをコピー
- 復旧が最も簡単
- 時間と容量が多く必要
# 増分バックアップ
- 最後のバックアップ以降の変更ファイルのみ
- 高速で容量効率的
- 復旧時はフル+全増分が必要
# 差分バックアップ
- 最後のフルバックアップ以降の変更ファイル
- 中程度の時間/容量
- 復旧時はフル+最後の差分
2. tarによるバックアップ
2.1 基本バックアップ
# 圧縮バックアップ作成
tar -czvf backup_$(date +%Y%m%d).tar.gz /path/to/data
# 特定ディレクトリ除外
tar -czvf backup.tar.gz --exclude='*.log' --exclude='cache' /data
# 分割圧縮(大容量)
tar -cvf - /data | split -b 1G - backup_part_
# 圧縮解凍
tar -xzvf backup.tar.gz -C /restore/path
2.2 増分バックアップ
# スナップショットファイル使用増分バックアップ
# 初回(フル)
tar -czvf full_backup.tar.gz -g /var/backup/snapshot.snar /data
# 2回目(増分)
tar -czvf incr_backup_1.tar.gz -g /var/backup/snapshot.snar /data
# 復旧(順番通り)
tar -xzvf full_backup.tar.gz -g /dev/null -C /restore
tar -xzvf incr_backup_1.tar.gz -g /dev/null -C /restore
3. rsyncによるバックアップ
3.1 ローカル同期
# 基本同期
rsync -avh /source/ /backup/
# 削除されたファイルも同期
rsync -avh --delete /source/ /backup/
# 進捗表示
rsync -avh --progress /source/ /backup/
# テスト(dry-run)
rsync -avhn /source/ /backup/
3.2 リモートバックアップ
# SSH経由リモートバックアップ
rsync -avhz -e ssh /local/data/ user@remote:/backup/
# 帯域幅制限
rsync -avhz --bwlimit=1000 /data/ user@remote:/backup/
# 部分転送再開
rsync -avhz --partial --progress /data/ user@remote:/backup/
# 特定SSHキー使用
rsync -avhz -e "ssh -i ~/.ssh/backup_key" /data/ user@remote:/backup/
3.3 rsyncバックアップスクリプト
#!/bin/bash
# rsync_backup.sh
SOURCE="/home /etc /var/www"
DEST="/mnt/backup"
LOG="/var/log/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
echo "=== バックアップ開始: $DATE ===" >> $LOG
for dir in $SOURCE; do
rsync -avh --delete \
--exclude='*.tmp' \
--exclude='cache' \
"$dir" "$DEST" >> $LOG 2>&1
done
echo "=== バックアップ完了: $(date +%Y%m%d_%H%M%S) ===" >> $LOG
4. データベースバックアップ
4.1 MySQL/MariaDB
# フルバックアップ
mysqldump -u root -p --all-databases > all_db_$(date +%Y%m%d).sql
# 特定データベース
mysqldump -u root -p mydb > mydb_$(date +%Y%m%d).sql
# 圧縮バックアップ
mysqldump -u root -p mydb | gzip > mydb_$(date +%Y%m%d).sql.gz
# 復旧
mysql -u root -p < backup.sql
gunzip < backup.sql.gz | mysql -u root -p mydb
4.2 PostgreSQL
# フルバックアップ
pg_dumpall -U postgres > all_db_$(date +%Y%m%d).sql
# 特定データベース
pg_dump -U postgres mydb > mydb_$(date +%Y%m%d).sql
# カスタムフォーマット(並列復旧可能)
pg_dump -U postgres -Fc mydb > mydb.dump
# 復旧
psql -U postgres < backup.sql
pg_restore -U postgres -d mydb mydb.dump
5. 自動化バックアップ
5.1 cron設定
# crontab -e
# 毎日午前2時フルバックアップ
0 2 * * * /root/scripts/daily_backup.sh
# 毎週日曜日フルバックアップ
0 3 * * 0 /root/scripts/weekly_backup.sh
# 毎時増分バックアップ
0 * * * * /root/scripts/hourly_incremental.sh
5.2 総合バックアップスクリプト
#!/bin/bash
# comprehensive_backup.sh
# 設定
BACKUP_DIR="/mnt/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
LOG="/var/log/backup.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG
}
# バックアップディレクトリ作成
mkdir -p "$BACKUP_DIR/$DATE"
log "バックアップ開始"
# システム設定バックアップ
tar -czf "$BACKUP_DIR/$DATE/etc.tar.gz" /etc 2>/dev/null
log "システム設定バックアップ完了"
# Webデータバックアップ
tar -czf "$BACKUP_DIR/$DATE/www.tar.gz" /var/www 2>/dev/null
log "Webデータバックアップ完了"
# MySQLバックアップ
mysqldump -u root --all-databases | gzip > "$BACKUP_DIR/$DATE/mysql.sql.gz"
log "MySQLバックアップ完了"
# 古いバックアップ削除
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
log "古いバックアップ整理完了"
log "バックアップ完了"
6. 復旧手順
6.1 ファイル復旧
# tar圧縮解凍
tar -xzvf backup.tar.gz -C /restore/path
# 特定ファイルのみ復旧
tar -xzvf backup.tar.gz -C /restore path/to/file
# rsync復旧
rsync -avh /backup/data/ /restore/data/
6.2 システム復旧
# 1. ライブUSB/CDで起動
# 2. ファイルシステムマウント
mount /dev/sda1 /mnt
# 3. バックアップから復旧
tar -xzvf /backup/root.tar.gz -C /mnt
# 4. ブートローダー復旧
grub-install --root-directory=/mnt /dev/sda
# 5. 再起動
7. 復旧テスト
#!/bin/bash
# backup_verify.sh
BACKUP_FILE="$1"
TEST_DIR="/tmp/backup_test_$$"
mkdir -p "$TEST_DIR"
echo "バックアップファイル検証中: $BACKUP_FILE"
# 圧縮整合性確認
if tar -tzf "$BACKUP_FILE" > /dev/null 2>&1; then
echo "圧縮整合性: OK"
else
echo "圧縮整合性: FAILED"
exit 1
fi
# テスト復旧
tar -xzf "$BACKUP_FILE" -C "$TEST_DIR"
FILE_COUNT=$(find "$TEST_DIR" -type f | wc -l)
echo "復旧ファイル数: $FILE_COUNT"
# 整理
rm -rf "$TEST_DIR"
echo "検証完了"
8. クラウドバックアップ
# AWS S3バックアップ
aws s3 sync /data s3://mybucket/backup/
# Google Cloud Storage
gsutil rsync -r /data gs://mybucket/backup/
# rclone(様々なクラウド対応)
rclone sync /data remote:backup/
9. 災害復旧計画(DRP)
# 災害復旧計画チェックリスト
1. 重要データの特定と優先順位
2. RPO(復旧時点目標)の定義
3. RTO(復旧時間目標)の定義
4. バックアップ場所と方法の文書化
5. 復旧手順の文書化
6. 定期的な復旧テスト
7. 担当者連絡先と役割
8. 定期レビューと更新
まとめ
バックアップはサーバー運用の生命線です。定期的なバックアップ、復旧テスト、そして災害復旧計画を通じて、どんな状況でもデータを保護できます。最終編ではセキュリティ強化と脆弱性管理を解説します。