SQL Server 在 Debian 上的备份策略制定
一 策略总览与恢复目标
二 备份频率与保留周期建议
| 数据库级别 | 恢复模式 | 建议频率 | 保留周期 | 说明 |
|---|---|---|---|---|
| 系统库(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 天 | 以空间优先 |
三 落地实施步骤
sudo mkdir -p /var/opt/mssql/backup && sudo chown mssql:mssql /var/opt/mssql/backup#!/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;"
#!/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;"
# 每周日 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
0 4 * * * rsync -a --delete /var/opt/mssql/backup/ backup@backup-host:/backup/mssql/
四 监控验证与容量规划
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;
五 常见陷阱与替代方案