SQL Server 在 Ubuntu 的备份与恢复策略
一 策略总览
- 备份类型与适用场景
- 完整备份 Full:备份整个数据库,作为所有恢复的基础。建议至少每日执行一次。
- 差异备份 Differential:备份自上次完整备份后的变更,缩短恢复时间。建议每小时或每6小时一次(取决于变更量)。
- 事务日志备份 Log:记录所有已提交事务,支持时间点恢复(PITR)。建议每5–15分钟一次(取决于RPO)。
- 文件组备份 Filegroup:适用于超大型数据库,仅备份指定文件组,提升灵活性与速度。
- 恢复模型选择
- FULL:需要时间点恢复时使用;必须定期做日志备份。
- BULK_LOGGED:在大量批量导入时减少日志量,同时保留时间点恢复能力(受限)。
- SIMPLE:无法做日志备份,仅支持到最近一次完整/差异备份,适用于可容忍数据丢失的场景。
- 存储与保留
- 备份目录建议使用本地磁盘(如 /var/opt/mssql/backups),权限设为 mssql:mssql,700;定期清理过期备份(如保留30天)。
- 自动化与监控
- 使用 sqlcmd + cron 定时执行;脚本需记录日志、校验结果并告警;定期做恢复演练验证可用性。
二 备份实施步骤
- 准备备份目录与权限
- 创建目录并设定属主属组与权限:
- sudo mkdir -p /var/opt/mssql/backups
- sudo chown mssql:mssql /var/opt/mssql/backups
- sudo chmod 700 /var/opt/mssql/backups
- 安装客户端工具
- sudo apt-get update && sudo apt-get install msodbcsql17
- 单库备份脚本示例(T-SQL)
- BACKUP DATABASE [YourDB] TO DISK = N’/var/opt/mssql/backups/YourDB_2025-12-06.bak’
- WITH FORMAT, COMPRESSION, INIT, STATS = 10;
- 多库备份脚本示例(T-SQL,排除系统库)
- DECLARE @DBNAME NVARCHAR(100), @BackupPath NVARCHAR(100) = N’/var/opt/mssql/backups/';
- BEGIN TRY
- EXEC xp_create_subdir @BackupPath;
- DECLARE Cur CURSOR FOR
- SELECT name FROM sys.databases WHERE name NOT IN (N’master’, N’tempdb’, N’model’, N’msdb’);
- OPEN Cur; FETCH NEXT FROM Cur INTO @DBNAME;
- WHILE @@FETCH_STATUS = 0
- BEGIN
- DECLARE @File NVARCHAR(500) = @BackupPath + @DBNAME + N’_’ + CONVERT(NVARCHAR(8), GETDATE(), 112) + N’.bak’;
- EXEC(N’BACKUP DATABASE [’ + @DBNAME + N’] TO DISK = N’‘’ + @File + N’‘’ WITH INIT, COMPRESSION, STATS = 5’);
- FETCH NEXT FROM Cur INTO @DBNAME;
- END; CLOSE Cur; DEALLOCATE Cur;
- END TRY BEGIN CATCH PRINT ERROR_MESSAGE(); END CATCH
- 执行与调度
- 执行脚本:/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘YourPassword’ -i backup.sql
- 定时清理(保留30天):0 2 * * * find /var/opt/mssql/backups/ -name “*.bak” -mtime +30 -exec rm {} ;
- 定时备份(示例每日1点):0 1 * * * /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘YourPassword’ -i /path/backup.sql >> /var/log/mssql/backup.log 2>&1
三 恢复实施步骤
- 时间点恢复流程(Full + Diff + Log)
- 若需继续前滚,先备份当前日志尾部:
- BACKUP LOG [YourDB] TO DISK = N’/var/opt/mssql/backups/YourDB_tail.trn’ WITH NORECOVERY;
- 还原最近一次完整备份(无恢复,进入还原状态):
- RESTORE DATABASE [YourDB] FROM DISK = N’/var/opt/mssql/backups/YourDB_full_2025-12-06.bak’
- WITH NORECOVERY, REPLACE;
- 如有差异备份,还原差异(无恢复):
- RESTORE DATABASE [YourDB] FROM DISK = N’/var/opt/mssql/backups/YourDB_diff_2025-12-06.bak’
- 还原日志至误删前的时间点(进入可用状态):
- RESTORE LOG [YourDB] FROM DISK = N’/var/opt/mssql/backups/YourDB_log_*.trn’
- WITH STOPAT = N’2025-12-06 10:00:00’, RECOVERY;
- 仅完整备份恢复
- RESTORE DATABASE [YourDB] FROM DISK = N’/var/opt/mssql/backups/YourDB_full.bak’ WITH RECOVERY;
- 使用 SSMS 图形界面
- 通过 SSMS 连接到实例,使用“备份/还原数据库”向导执行上述步骤(适合复杂还原与验证)。
四 验证与运维要点
- 完整性校验
- 恢复后在目标库执行:DBCC CHECKDB ([YourDB]) 检查分配与一致性;定期抽样还原到测试库验证可用性。
- 安全与权限
- 备份文件权限 700、属主 mssql:mssql;凭据避免硬编码,建议使用 SQL Server 身份验证的受限账户或 Ubuntu 密钥环/凭据管理;传输到外部存储时启用 TLS/加密。
- 监控与告警
- 记录备份日志并重试失败任务;对“备份失败/备份年龄过大/可用空间不足”设置告警;保留演练记录与校验结果。
- 高可用与额外保护
- 结合 Always On 可用性组或 日志传送实现高可用与异地保护;定期将备份复制到远程/对象存储以防范站点级故障。