温馨提示×

Linux Trigger如何实现数据备份与恢复

小樊
40
2025-12-31 00:57:31
栏目: 智能运维

Linux 下用 Trigger 实现备份与恢复的可落地方案

一、概念澄清与总体思路

  • 在 Linux 运维语境中,Trigger 通常指两类机制:
    • 事件触发:基于 inotify 监听目录/文件事件(创建、修改、删除),即时触发备份或快照。
    • 时间触发:基于 cron 的定时任务,按周期执行全量/增量备份。
  • 备份手段以 rsync(文件级增量/快照)、tar(归档压缩)、数据库原生工具(如 mysqldump)为主;恢复则对应 rsync 回滚tar 解包数据库导入
  • 推荐策略:每周全量 + 每日增量;本地保留若干天,并通过 rsync over SSH 同步到远程/云端做异地冗余。

二、事件触发备份 inotify + rsync 快照

  • 适用场景:对关键目录的变更进行“准实时”备份(如上传目录、配置目录)。
  • 思路:用 inotifywait 监听事件,调用 rsync 做“基于上次备份的增量快照”(–link-dest 硬链复用未变文件,节省空间)。
  • 示例脚本(事件触发)
    #!/usr/bin/env bash
    set -Eeuo pipefail
    SRC="/data/www"
    BASE="/backup/rsync_snap"
    DATE=$(date +%F_%H%M%S)
    LAST="$BASE/last"
    CUR="$BASE/$DATE"
    
    mkdir -p "$CUR"
    RSYNC_OPTS=(-a --delete --link-dest="$LAST" --log-file="$BASE/rsync.log")
    
    # 首次全量
    if [[ ! -d "$LAST" ]]; then
      rsync "${RSYNC_OPTS[@]}" "$SRC/" "$CUR/"
    else
      # 事件触发增量(配合 inotifywait 使用)
      rsync "${RSYNC_OPTS[@]}" "$SRC/" "$CUR/"
    fi
    
    # 原子切换快照
    ln -snf "$CUR" "$LAST"
    # 清理 7 天前快照
    find "$BASE" -maxdepth 1 -type d -mtime +7 -name '20*' -exec rm -rf {} +
    
    • 配合 inotifywait 常驻监听(建议 systemd 托管):
      inotifywait -m -r -e create,modify,delete,move \
        --format '%e %w%f' /data/www | while IFS=' ' read -r evt file; do
        /usr/local/bin/backup_inotify.sh
      done
      
  • 要点
    • 使用 –link-dest 实现“多时间点快照”,恢复时直接指向对应日期目录即可。
    • 远程备份可改为:rsync “${RSYNC_OPTS[@]}” -e ssh “$SRC/” “user@host:$CUR/”。

三、时间触发备份 cron + 组合策略

  • 适用场景:稳定、可预期的周期备份(如每日增量、每周全量)。
  • 示例脚本(时间触发,含压缩与保留策略)
    #!/usr/bin/env bash
    set -Eeuo pipefail
    SRC="/data"
    DEST="/backup"
    DATE=$(date +%F)
    LOG="$DEST/backup_$DATE.log"
    
    mkdir -p "$DEST"
    
    # 每周日全量,其余日增量(基于上次全量)
    if [[ $(date +%u) -eq 7 ]]; then
      # 全量 tar.gz
      tar czf "$DEST/full_$DATE.tar.gz" -C "$SRC" . >>"$LOG" 2>&1
      # 更新全量标记
      ln -snf "$DEST/full_$DATE.tar.gz" "$DEST/full_latest.tar.gz"
    else
      # 增量 tar.gz(基于上次全量快照)
      tar czf "$DEST/incr_$DATE.tar.gz" -g "$DEST/snapshot.snar" -C "$SRC" . >>"$LOG" 2>&1
    fi
    
    # 保留策略:全量保留 4 周,增量保留 7 天
    find "$DEST" -maxdepth 1 -name 'full_*.tar.gz' -mtime +28 -delete
    find "$DEST" -maxdepth 1 -name 'incr_*.tar.gz' -mtime +7  -delete
    
    echo "[$(date)] Backup finished, see $LOG"
    
    • 定时任务(root 或具备相应权限的用户):
      # 每天 02:00 执行
      0 2 * * * /usr/local/bin/backup_cron.sh
      # 每天 04:00 同步到远程
      0 4 * * * rsync -avz --delete /backup/ user@backup.example.com:/backup/
      
  • 要点
    • 使用 tar -g snapshot.snar 做“基于快照的增量”;恢复时按顺序先全量后增量。

四、数据库备份与恢复要点

  • MySQL 示例(定时 + 保留 + 远程)
    #!/usr/bin/env bash
    set -Eeuo pipefail
    DB_HOST="localhost"
    DB_USER="backup"
    DB_PASS="******"
    DB_NAME="appdb"
    BACKUP_DIR="/backup/mysql"
    DATE=$(date +%F_%H%M)
    mkdir -p "$BACKUP_DIR"
    
    mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" \
      > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql"
    
    # 保留 30 天
    find "$BACKUP_DIR" -name '*.sql' -mtime +30 -delete
    
    # 可选:同步到远程
    rsync -avz "$BACKUP_DIR/" user@backup.example.com:/backup/mysql/
    
    • 恢复(简单导入):
      mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < /backup/mysql/appdb_2025-12-31_0200.sql
      
    • 如需时间点恢复(Point-in-Time Recovery),启用 binlog 并用 mysqlbinlog 回放指定时间/位置区间。

五、恢复流程与应急要点

  • 文件级快照恢复(rsync)
    • 直接回滚到某次快照目录(事件触发方案):
      rsync -a --delete /backup/rsync_snap/2025-12-30_0200/ /data/www/
      
    • 归档恢复(时间触发方案):先全量后增量
      tar xzf /backup/full_2025-12-28.tar.gz -C /
      tar xzf /backup/incr_2025-12-29.tar.gz -C /
      tar xzf /backup/incr_2025-12-30.tar.gz -C /
      
  • 数据库恢复
    • 逻辑备份导入(见上节)。
    • 时间点恢复(示例):
      mysqlbinlog --start-datetime="2025-12-30 10:00:00" \
                  --stop-datetime="2025-12-30 10:15:00" \
                  /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
      
  • 误删文件的应急
    • 立即停止对分区写入(必要时只读挂载),优先对分区做镜像备份后再用工具尝试恢复:
      sudo mount -o remount,ro /dev/sdX1
      sudo dd if=/dev/sdX1 of=/backup/sdX1.img bs=4M
      
    • 常用工具:extundelete(ext3/ext4)、TestDisk/PhotoRec(多文件系统/文件雕刻)、foremost/scalpel(特征恢复)。

0