CentOS系统下SQL Server数据库恢复妙招

一 准备与环境检查
- 确认备份可用:至少准备一份可用的完整备份(.bak),如需时间点恢复,还需一系列事务日志备份(.trn)。将备份文件放到 SQL Server 可访问的目录,例如 /var/opt/mssql/backups,并确保权限正确(属主 mssql:mssql,权限 700)。
- 安装客户端工具:在 CentOS 上安装 mssql-tools,便于用 sqlcmd 执行恢复命令。
- 连接实例:使用命令连接本地实例(示例:
sqlcmd -S localhost -U SA -P ')。' - 恢复前检查:确认目标实例磁盘空间充足、目标数据库不存在或允许覆盖、备份文件完整可读。
二、标准恢复流程与常用指令
- 完整恢复(最常见):
RESTORE DATABASE [YourDB]
FROM DISK = '/var/opt/mssql/backups/YourDB.bak'
WITH RECOVERY, REPLACE; - 完整 + 差异 + 日志的时间点恢复:
-- 1) 完整备份(NORECOVERY 以便后续还原)
RESTORE DATABASE [YourDB]
FROM DISK = '/var/opt/mssql/backups/YourDB.bak'
WITH NORECOVERY;
-- 2) 差异备份(如存在,NORECOVERY)
RESTORE DATABASE [YourDB]
FROM DISK = '/var/opt/mssql/backups/YourDB_Diff.bak'
WITH NORECOVERY;
-- 3) 事务日志(时间点或到末尾)
RESTORE LOG [YourDB]
FROM DISK = '/var/opt/mssql/backups/YourDB_Log.trn'
WITH RECOVERY; -- 如需恢复到特定时间点:WITH STOPAT = '2025-12-09 10:00:00' - 覆盖现有同名库:在完整恢复语句中加入 WITH REPLACE。
- 还原到新库并改名(避免覆盖):在 WITH 子句中加入 MOVE 指定新文件路径,例如:
提示:如需获取逻辑文件名,可在源库执行RESTORE DATABASE [YourDB_New]
FROM DISK = '/var/opt/mssql/backups/YourDB.bak'
WITH MOVE 'YourDB_Data' TO '/var/opt/mssql/data/YourDB_New.mdf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_New.ldf',
RECOVERY, REPLACE;RESTORE FILELISTONLY FROM DISK = '/path/YourDB.bak';。
三 特殊场景与注意事项
- 系统数据库恢复:如 master 等系统库异常,通常需要从模板重建实例、还原系统库备份,并校正文件路径;该过程风险高,建议由有经验的 DBA 在维护窗口操作。
- 无备份或备份损坏:可尝试第三方工具(如 SysTools SQL Recovery、Recovery for SQL Server),但成功率取决于损坏程度,务必先对原介质做只读镜像。
- 权限与路径:确保运行 SQL Server 的 mssql 用户对备份与数据目录具备读写权限;还原到新路径时,提前创建目录并赋权。
- 恢复模式:如需做时间点恢复,数据库应处于 FULL 恢复模式,并定期执行日志备份。
四 恢复后验证与常见排错
- 完整性校验:执行
DBCC CHECKDB ([YourDB]) WITH NO_INFOMSGS, ALL_ERRORMSGS;检查对象与分配页一致性。 - 统计信息与索引:更新统计信息、重建/重组索引,确保查询性能恢复。
- 基本连通与数据核验:连接应用或执行抽样查询,核对关键表行数与关键业务数据。
- 日志与错误:若还原失败,优先查看 SQL Server 错误日志(默认路径 /var/opt/mssql/log/errorlog)与
sqlcmd输出,定位是权限、路径、空间还是备份集问题。