在 CentOS 上恢复 SQL Server 数据库的实用步骤
一 准备与前置检查
- 确认备份可用:通常为 .bak(完整/差异)与 .trn(事务日志)。如无有效备份,无法执行标准恢复。
- 将备份文件放到 SQL Server 可访问的目录,建议放在实例数据目录(如 /var/opt/mssql/)或自建备份目录(如 /var/opt/mssql/backups),并设置权限:
sudo mkdir -p /var/opt/mssql/backups
sudo chown mssql:mssql /var/opt/mssql/backups
sudo chmod 700 /var/opt/mssql/backups
- 验证备份文件是否可读:ls -l /var/opt/mssql/backups/;必要时用 sqlcmd 执行 RESTORE HEADERONLY 检查备份集信息。
- 建议将数据库恢复模式设为 FULL,以便执行差异与日志备份的连续恢复。
二 使用 T‑SQL 执行恢复
-
完整恢复(最常见):
RESTORE DATABASE [YourDB]
FROM DISK = N’/var/opt/mssql/backups/YourDB.bak’
WITH RECOVERY, REPLACE;
说明:WITH RECOVERY 表示还原完成后立即可用;WITH REPLACE 在目标库已存在时强制覆盖。
-
差异恢复(在完整备份之后):
RESTORE DATABASE [YourDB]
FROM DISK = N’/var/opt/mssql/backups/YourDB_Diff.bak’
WITH NORECOVERY;
RESTORE LOG [YourDB]
FROM DISK = N’/var/opt/mssql/backups/YourDB_Log.trn’
WITH RECOVERY;
说明:差异备份后通常接事务日志备份;最后一次用 WITH RECOVERY 结束恢复流程。
-
时间点恢复(在完整+差异后,用日志恢复到指定时刻):
RESTORE LOG [YourDB]
FROM DISK = N’/var/opt/mssql/backups/YourDB_Log.trn’
WITH STOPAT = ‘2025-12-21 10:30:00’, RECOVERY;
-
指定数据文件路径(当备份来自其他实例或路径不一致时):
RESTORE DATABASE [YourDB]
FROM DISK = N’/var/opt/mssql/backups/YourDB.bak’
WITH MOVE N’YourDB_Data’ TO N’/var/opt/mssql/data/YourDB.mdf’,
MOVE N’YourDB_Log’ TO N’/var/opt/mssql/data/YourDB_log.ldf’,
RECOVERY, REPLACE;
提示:逻辑文件名可用 RESTORE FILELISTONLY 查看。
三 常用命令与连接工具
- 使用 sqlcmd 本地执行:
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘’ -i restore.sql
- 远程执行(在 Windows 或另一台 Linux 上):
/opt/mssql-tools/bin/sqlcmd -S <服务器IP或主机名>,1433 -U SA -P ‘’ -i restore.sql
- 备份文件传输:在 Windows 与 CentOS 之间可用 WinSCP(SFTP) 将 .bak/.trn 上传至目标目录(如 /SQLServer/SQLBackup 或 /var/opt/mssql/backups)。
四 验证与常见问题处理
- 验证恢复结果:
SELECT name, state_desc FROM sys.databases WHERE name = N’YourDB’;
DBCC CHECKDB ([YourDB]);
- 常见问题与要点:
- 目标库已存在冲突时,使用 WITH REPLACE;
- 多文件组/多日志文件需逐个 MOVE 到目标路径;
- 从 Windows 迁移到 Linux 时,注意文件路径分隔符与大小写敏感性;
- 若备份来自不同实例,先用 RESTORE FILELISTONLY 确认逻辑文件名;
- 恢复后按需重建索引、更新统计信息,并进行功能与性能验证。
五 是否需要停机的说明
- 常规数据库还原(非系统库)一般不需要停机;还原命令本身会处理必要的锁定与一致性检查。
- 若遇到异常或需替换系统数据库等特殊情况,再考虑临时停止服务:
sudo systemctl stop mssql-server
完成后启动:
sudo systemctl start mssql-server