Ubuntu上SQL Server数据库恢复方法
一、常用恢复方法概览
- sqlcmd + T‑SQL RESTORE:在 Ubuntu 终端直接用 sqlcmd 执行 RESTORE DATABASE,适合脚本化、自动化与无图形环境。支持完整、差异、日志备份及文件移动。
- SSMS 图形化恢复:在 Windows 上的 SSMS 连接到 Ubuntu 上的 SQL Server 实例,使用“还原数据库”向导执行恢复,适合可视化操作与复杂还原场景。
- SMO/第三方工具:通过 SMO(如 C#/PowerShell)或 Redgate SQL Backup Pro 等工具编排备份与恢复,适合企业级自动化与高级功能需求。
二、方法一 sqlcmd + T‑SQL 的标准流程
- 准备与放置备份文件
- 将 .bak 放到 SQL Server 可访问目录,常用为 /var/opt/mssql/backup 或 /var/opt/mssql/data;并设置权限(示例:sudo chown mssql:mssql /var/opt/mssql/backup)。
- 连接实例
- 本地:sqlcmd -S localhost -U SA -P ‘YourPassword’
- 基本完整恢复(WITH RECOVERY)
- RESTORE DATABASE [YourDB] FROM DISK=‘/var/opt/mssql/backup/YourDB.bak’ WITH RECOVERY
- 指定新文件路径(MOVE)
- RESTORE DATABASE [YourDB]
FROM DISK=‘/var/opt/mssql/backup/YourDB.bak’
WITH MOVE ‘YourDB_Data’ TO ‘/var/opt/mssql/data/YourDB_Data.mdf’,
MOVE ‘YourDB_Log’ TO ‘/var/opt/mssql/data/YourDB_Log.ldf’,
REPLACE, RECOVERY
- 查看备份内逻辑文件名
- RESTORE FILELISTONLY FROM DISK=‘/var/opt/mssql/backup/YourDB.bak’
- 差异/日志还原(在完整备份已还原为 NORECOVERY 后执行)
- 差异:RESTORE DATABASE [YourDB] FROM DISK=‘…’ WITH DIFFERENTIAL, RECOVERY
- 日志:RESTORE LOG [YourDB] FROM DISK=‘…’ WITH RECOVERY
- 常见要点
- 路径需 SQL Server 服务账号可写(默认 mssql:mssql)。
- 目标库存在时加 REPLACE;仅还原部分文件时用 MOVE 指定新位置。
三、方法二 使用 SSMS 在 Windows 上远程还原到 Ubuntu
- 将 .bak 放到 Ubuntu 的 /var/opt/mssql/data(或其他可访问目录,注意权限)。
- 在 SSMS 中连接到 Ubuntu 主机:1433 的 SQL Server 实例。
- 右键“数据库”→“还原数据库”,选择“设备”,加载 .bak;在“文件”页勾选“Relocate all files to folder”,指定 /var/opt/mssql/data。
- 选择“With Recovery”(或先 NORECOVERY 再按顺序还原差异/日志),执行还原。
四、方法三 自动化与高级方案
- SMO/脚本编排
- 使用 SMO(C#/PowerShell)封装备份与恢复流程,适合 CI/CD、批量与定时任务;亦可用 Redgate SQL Backup Pro 等第三方工具增强压缩、加密与调度能力。
- 定时与保留策略示例(Linux 侧)
- 备份脚本 + cron 定时执行;定期清理旧备份(如 find … -mtime +30 -delete)。
- 还原编排
- 在脚本中按“完整→差异→日志”顺序调用 RESTORE(必要时使用 NORECOVERY 串联多步)。
五、常见问题与排错要点
- 备份文件路径与权限:确保 mssql 用户对备份目录与 /var/opt/mssql/data 有读写权限;必要时使用 sudo chown/chmod 修正。
- 逻辑文件名不匹配:先用 RESTORE FILELISTONLY 查看 .bak 中的逻辑数据/日志文件名,再在 MOVE 中使用这些名称。
- 目标库已存在:使用 REPLACE 覆盖;或先 DROP/重命名现有库。
- 仅还原部分文件:为每个数据/日志文件显式 MOVE 到目标路径。
- 需要串联多步还原:先完整备份以 NORECOVERY 还原,再依次还原差异/日志并以 RECOVERY 结束。
- 还原后验证:执行 DBCC CHECKDB 检查一致性;在 SSMS 或 SELECT name FROM sys.databases 确认数据库在线。