Ubuntu 上 SQL Server 的备份策略
一 策略总览
- 备份类型与恢复能力
- 完整备份 Full:备份整个数据库,作为所有恢复链的起点。
- 差异备份 Differential:仅备份自上次完整备份以来变更的数据,速度快、体积小。
- 事务日志备份 Log:备份自上次日志备份(或完整/差异)以来的日志,支持时间点恢复 PITR。
- 文件组备份 Filegroup:适用于超大型数据库,按文件组粒度备份与恢复。
- 恢复模式与日志策略
- 简单恢复 Simple:不保留日志,不支持日志备份,适用于可接受仅到上次完整备份的数据丢失的场景。
- 完整恢复 Full:保留日志,需定期做日志备份,支持PITR。
- 大容量日志恢复 Bulk-logged:在大量导入/批量操作期间减少日志量,仍保留日志备份能力(注意日志链连续性)。
- 存储与保留
- 备份默认目录建议放在 /var/opt/mssql/data 或专用备份目录(如 /var/opt/mssql/backups),并确保 mssql 用户对该目录有读写权限(如:chown mssql:mssql,chmod 700)。
- 建议配置保留周期(如保留7–30天)与定期清理旧备份的任务,避免磁盘被占满。
二 推荐备份方案
- 高可用与可回滚(推荐)
- 恢复模式:FULL
- 频率:每周一次完整备份;每日一次差异备份;每5–15分钟一次事务日志备份
- 适用:生产环境、要求分钟级 RPO/RTO与时间点恢复的业务
- 成本与复杂度均衡
- 恢复模式:FULL
- 频率:每周一次完整备份;每日一次差异备份;每30–60分钟一次事务日志备份
- 适用:大多数业务系统的默认选择
- 简易与低成本
- 恢复模式:SIMPLE
- 频率:每日一次完整备份
- 适用:允许丢失最多1天数据的非核心系统
- 超大数据库优化
- 恢复模式:FULL
- 频率:按文件组执行完整/差异备份;日志备份保持高频
- 适用:TB 级库、变更集中在少数文件组的场景
三 自动化与异地容灾
- 定时调度
- 使用 crontab 调度备份脚本;如需作业编排与监控,可启用 SQL Server 代理(sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true 并重启服务)。
- 备份脚本示例(T-SQL 片段)
- 完整备份:BACKUP DATABASE [YourDB] TO DISK=‘/var/opt/mssql/backups/YourDB_full_$(date +%F).bak’ WITH FORMAT, COMPRESSION, STATS=10
- 差异备份:BACKUP DATABASE [YourDB] TO DISK=‘/var/opt/mssql/backups/YourDB_diff_$(date +%F).bak’ WITH DIFFERENTIAL, COMPRESSION, STATS=10
- 日志备份:BACKUP LOG [YourDB] TO DISK=‘/var/opt/mssql/backups/YourDB_log_$(date +%F_%H%M).trn’ WITH COMPRESSION, STATS=10
- 异地/对象存储
- 使用 rclone 将备份同步到远程对象存储或数据中心(如 MinIO/S3),实现异地备份/多活容灾与统一存储管理。
- 保留与清理
- 使用 find 按保留天数删除旧备份(如 -mtime +7 删除7天前文件),避免磁盘被占满。
四 恢复流程与验证
- 时间点恢复(示例)
- 1)还原最新完整备份(NORECOVERY):RESTORE DATABASE [YourDB] FROM DISK=‘…_full.bak’ WITH NORECOVERY
- 2)如有,还原最新差异备份(NORECOVERY):RESTORE DATABASE [YourDB] FROM DISK=‘…_diff.bak’ WITH NORECOVERY
- 3)还原自差异之后的日志备份至目标时点(RECOVERY):RESTORE LOG [YourDB] FROM DISK=‘…_log.trn’ WITH RECOVERY, STOPAT=‘2025-04-21 10:30:00’
- 仅完整/差异恢复
- 直接以 WITH RECOVERY 还原最新完整或差异备份即可上线。
- 完整性校验
- 恢复后在目标库执行 DBCC CHECKDB 校验数据一致性;定期抽样做恢复演练,验证备份可用性与流程有效性。