navicat 仅图形化执行 restore database 命令,不解析 .bak 文件;还原失败根因仅为路径/权限不足或版本不兼容(如 sql server 2019 备份无法在 2016 还原),且必须用 restore filelistonly 查逻辑名并配合 with move 指定新路径,跨版本时须转兼容目标版本的 sql 脚本。
navicat 本身不能直接还原 sql server 的 .bak 文件——它只是图形化执行 t-sql 的客户端,不参与备份文件解析。所有“还原失败”问题,本质是底层 restore database 命令被 sql server 拒绝,而非 navicat 故障。
为什么点“还原”按钮总报错?
常见错误如 Msg 3241, Level 16, State 7、Cannot open backup device 或 The media family is incorrectly formed,背后只有两类根因:
- 路径/权限问题:
.bak文件必须放在 SQL Server 实例能访问的本地磁盘路径(如D:\Backup\),且 SQL Server 服务账户(如NT SERVICE\MSSQLSERVER)对该目录有读取权限;你桌面或网络映射盘路径一定失败 - 版本硬性不兼容:SQL Server 2019 备份无法在 2016 实例上还原,这是引擎层限制,Navicat 再怎么点“高级选项”也绕不过去
还原时必须加 WITH MOVE 吗?
必须。Navicat 默认还原会尝试写入原数据库的物理路径(如 C:\Program Files\...\data\old_db.mdf),而目标服务器几乎不可能有相同路径结构。
实操要点:
- 先用
RESTORE FILELISTONLY FROM DISK = 'D:\Backup\source.bak'查出逻辑文件名(name列),不是你猜的xxx_Data - 在 Navicat 还原界面点“高级”→勾选“生成脚本并执行”,手动补全
MOVE子句,例如:RESTORE DATABASE [TestDB] FROM DISK = 'D:\Backup\source.bak' WITH REPLACE, MOVE 'SourceDB_Data' TO 'D:\Data\TestDB.mdf', MOVE 'SourceDB_Log' TO 'D:\Log\TestDB.ldf'
-
D:\Data\和D:\Log\目录必须已存在,且 SQL Server 有写权限;Navicat 不会自动创建
目标库正在使用?别硬等超时
错误提示 Exclusive access could not be obtained 表明数据库被其他连接占用。Navicat 没有“强制断连”开关,得手动处理:
- 在 Navicat 查询窗口执行:
ALTER DATABASE [TargetDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
- 执行完还原命令后,再执行:
ALTER DATABASE [TargetDB] SET MULTI_USER
- 不要依赖 Navicat 界面里“关闭现有连接”的勾选项——它只在 SSMS 里生效,Navicat 不支持该行为
跨版本还原根本走不通?换脚本法
若源是 SQL Server 2019,目标是 2016,RESTORE DATABASE 必然失败。此时唯一可靠路径是转 SQL 脚本:
- 右键源库 → “转储 SQL 文件” → 勾选“结构”和“数据”
- 关键:在“选项”页中,**必须设置“兼容模式”为你目标版本(如 SQL Server 2016)**,否则导出
STRING_AGG、SEQUENCE等语法,低版本直接报错 - 取消勾选“导出外键约束”:Navicat 默认按表名排序建表,极易触发依赖断裂(如视图引用未创建的表)
- 导入前,在脚本开头加
SET FOREIGN_KEY_CHECKS = 0;(MySQL)或SET IDENTITY_INSERT [table] ON;(SQL Server 自增主键插入前)
最易被忽略的是逻辑文件名查证和兼容模式设置——跳过这两步,90% 的还原失败都源于此。











