温馨提示×

SQL Server在Debian上的备份策略如何制定

小樊
47
2025-11-22 23:55:53
栏目: 云计算

SQL Server 在 Debian 上的备份策略制定

一 策略总览与恢复目标

  • 明确RPO(恢复点目标)RTO(恢复时间目标):例如 RPO ≤ 15 分钟、RTO ≤ 1 小时,据此决定备份频率与保留周期。
  • 采用分层备份组合:
    • 完整备份:覆盖整个数据库,作为恢复基线。
    • 差异备份:自上次完整备份以来的变更,缩短恢复路径。
    • 事务日志备份:记录所有已提交事务,支持时间点恢复(PITR)
  • 备份存储遵循3-2-1 原则:至少3份副本、2种不同介质、1份异地/离线。
  • 建议将数据库恢复模式设为FULL,以便支持日志备份与时间点恢复。

二 备份频率与保留周期建议

  • 下表给出通用落地建议(可按业务重要性、变更频率与存储容量微调):
数据库级别 恢复模式 建议频率 保留周期 说明
系统库(master、msdb、model) FULL 每日或每周 7–30 天 保障实例级对象与作业可恢复
关键业务库 FULL 每周一次(如周日 02:00 4–12 周 作为恢复基线
DIFF 每日一次(如周一至周六 02:30 7–14 天 缩短恢复链路
LOG 15–60 分钟 7–14 天 支持 PITR
一般业务库 FULL 每周一次 2–8 周 基线备份
DIFF 每日一次 7 天 可选
LOG 30–120 分钟或不启用 7 天 视 RPO 决定
测试/临时库 SIMPLE 每日或每周 1–7 天 以空间优先
  • 日志备份前提:数据库恢复模式必须为FULLBULK_LOGGED;日志链中断将无法进行时间点恢复。

三 落地实施步骤

    1. 准备备份目录与权限
    • 建议目录:/var/opt/mssql/backup;确保 mssql 用户与组可读写。
    • 示例:sudo mkdir -p /var/opt/mssql/backup && sudo chown mssql:mssql /var/opt/mssql/backup
    1. 编写备份脚本(示例)
    • 全备脚本(示例):backup_full.sh
      #!/usr/bin/env bash
      set -Eeuo pipefail
      BACKUP_DIR="/var/opt/mssql/backup"
      DB_NAME="${1:-YourDatabaseName}"
      TS=$(date +"%Y%m%d%H%M%S")
      BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_full_$TS.bak"
      
      mkdir -p "$BACKUP_DIR"
      sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -Q "
        BACKUP DATABASE [$DB_NAME]
        TO DISK = N'$BACKUP_FILE'
        WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10, COMPRESSION, CHECKSUM;
        RESTORE VERIFYONLY FROM DISK = N'$BACKUP_FILE' WITH NOUNLOAD;"
      
    • 差异备份(示例):将 BACKUP DATABASE 改为 BACKUP DATABASE … WITH DIFFERENTIAL
    • 日志备份(示例):backup_log.sh
      #!/usr/bin/env bash
      set -Eeuo pipefail
      BACKUP_DIR="/var/opt/mssql/backup"
      DB_NAME="${1:-YourDatabaseName}"
      TS=$(date +"%Y%m%d%H%M%S")
      BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_log_$TS.trn"
      
      sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -Q "
        BACKUP LOG [$DB_NAME]
        TO DISK = N'$BACKUP_FILE'
        WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10, COMPRESSION, CHECKSUM;"
      
    • 要点:使用 FORMAT, INIT 生成新介质集;开启 COMPRESSION 节省空间;使用 CHECKSUMRESTORE VERIFYONLY 做基本校验。
    1. 定时调度(cron)
    • 示例(关键库):
      # 每周日 02:00 全备
      0 2 * * 0 /opt/scripts/backup_full.sh YourCriticalDB >> /var/log/mssql/backup_full.log 2>&1
      # 周一至周六 02:30 差异备
      30 2 * * 1-6 /opt/scripts/backup_diff.sh YourCriticalDB >> /var/log/mssql/backup_diff.log 2>&1
      # 每 15 分钟日志备
      */15 * * * * /opt/scripts/backup_log.sh YourCriticalDB >> /var/log/mssql/backup_log.log 2>&1
      # 清理 30 天前备份
      0 3 * * * find /var/opt/mssql/backup -name "*.bak" -o -name "*.trn" -mtime +30 -delete
      
    1. 异地/云端副本
    • 本地备份完成后,使用 rsync/scp 或云存储 CLI 同步到远程存储,作为离站副本
      0 4 * * * rsync -a --delete /var/opt/mssql/backup/ backup@backup-host:/backup/mssql/
      
    1. 安全与合规
    • 避免在命令行中明文写密码,建议使用 SQL Server 身份验证的集成机制环境变量/密钥管理服务;对备份文件设置最小权限访问控制

四 监控验证与容量规划

  • 监控与告警
    • 记录脚本输出与返回码;对失败告警(如通过邮件、企业微信、PagerDuty)。
    • 定期查询 msdb.dbo.backupset 校验最近一次备份时间与类型:
      SELECT
        database_name,
        backup_type = CASE type
          WHEN 'D' THEN 'Full'
          WHEN 'I' THEN 'Differential'
          WHEN 'L' THEN 'Log'
        END,
        backup_start_date,
        backup_finish_date,
        DATEDIFF(MINUTE, backup_start_date, backup_finish_date) AS duration_min
      FROM msdb.dbo.backupset
      WHERE database_name = 'YourDatabaseName'
      ORDER BY backup_finish_date DESC;
      
  • 定期恢复演练
    • 每月从全备+差异+日志全备+日志链路执行一次时间点恢复演练,验证 RPO/RTO 达标。
  • 容量规划
    • 预估增长与日志量,保留窗口内总容量 = 全备大小 × 保留份数 + 日增数据量 × 保留天数 + 日志备份量 × 日志频率 × 保留天数。
    • 启用 压缩 通常可显著减少体积;结合 校验定期清理 避免磁盘被占满。

五 常见陷阱与替代方案

  • 常见陷阱
    • 恢复模式为 SIMPLE 时无法做日志备份,无法达成细粒度 RPO。
    • 日志链断裂(如切换到 SIMPLE、异常关闭)会导致无法 PITR,需重新建立基线。
    • 仅本地单副本、无异地/离线副本,存在单点故障风险。
    • 备份未校验或长期不演练,真实灾难时可能不可用。
  • 替代/补充方案
    • 若运行在 容器 中,可将备份目录挂载为卷,由宿主机或编排系统执行快照/复制。
    • 使用 SQL Server Agent(若可用)编排备份作业,结合 维护计划 实现全/差/日志的自动化与告警。
    • 借助第三方备份平台(安装代理)实现集中备份、加密、异地复制与审计

0