Navicat 不直接执行 SQL Server 备份,而是调用服务器端 BACKUP DATABASE 语句生成 .bak 文件;需确保登录账号具备 db_backupoperator 权限、备份路径对 SQL Server 服务账户可写、数据库处于在线状态,且还原时须设为 SINGLE_USER 并勾选 WITH REPLACE。
navicat 本身不直接执行 sql server 的 backup database 操作,而是通过调用 sql server 实例上的 t-sql 脚本或依赖其内置的“sql server 备份”功能(需连接到 sql server 实例并具备相应权限)来完成。关键点在于:你不是在 navicat 里“导出 sql 文件”,而是在它界面里触发一次服务器端的物理备份(生成 .bak 文件),该文件由 sql server 引擎写入指定路径。
Navicat 的“SQL Server 备份”按钮实际做了什么
点击数据库旁的 SQL Server 备份 图标后,Navicat 会构造并提交一条标准的 BACKUP DATABASE ... TO DISK=... 语句到目标 SQL Server 实例。这个操作必须满足:
- 当前登录账号在 SQL Server 中拥有
db_backupoperator角色或sysadmin权限 - 指定的备份路径(如
C:Backupmydb.bak)对 SQL Server 服务账户(通常是NT ServiceMSSQLSERVER或自定义账户)可写 - 数据库处于在线状态(
READ_WRITE),且未被其他进程独占(如还原中、单用户模式)
如果你看到“备份成功”但本地找不到 .bak 文件,大概率是路径写在了 SQL Server 所在服务器的磁盘上,而不是你的 Navicat 客户端机器。
备份路径必须指向 SQL Server 本地或网络共享卷
Navicat 提供的备份路径输入框,填的是 SQL Server 进程能访问的路径,不是 Navicat 所在机器的路径。常见错误包括:
- 填
D:ackup est.bak—— 但 SQL Server 服务运行在另一台服务器上,D 盘不存在 - 填
\192.168.1.100share est.bak—— 但 SQL Server 服务账户没权限访问该共享(需用net use映射或配置域凭据) - 填
C: emp—— 但 SQL Server 服务账户默认无写入C:权限(尤其 Windows Server 默认策略)
推荐做法:在 SQL Server 服务器上手动创建专用目录(如 C:MSSQLBackup),右键属性 → 安全 → 添加 SQL Server 服务账户(如 NT SERVICEMSSQLSERVER),赋予“修改”权限;然后在 Navicat 备份对话框中填 C:MSSQLBackupmydb_20260727.bak。
还原时“无法获得独占访问权”的典型解法
用 Navicat 还原 .bak 文件时报错 Exclusive access could not be obtained because the database is in use.,本质是目标数据库正被其他连接占用。不能只靠 Navicat 点击“还原”就解决:
- 先在 Navicat 中右键目标数据库 → “编辑数据库” → “选项” → “限制访问” → 设为
SINGLE_USER - 确保勾选还原选项中的
WITH REPLACE(否则可能因已有同名数据库拒绝覆盖) - 如果还原目标库名与备份来源不同,注意检查还原对话框里的“还原为数据库”字段是否填对,且新库名未被占用
- 还原完成后,记得再把数据库设回
MULTI_USER,否则应用连不上
这步常被跳过,导致还原看似成功,但数据库实际处于单用户锁定状态,后续所有连接失败。
定时备份必须用批作业 + SQL 脚本,而非图形界面
Navicat 的图形化“SQL Server 备份”无法设置定时任务;真正可行的定时方案是:
- 新建查询,手写 T-SQL 备份语句(含动态时间戳,如
CONVERT(VARCHAR, GETDATE(), 112) + '_' + REPLACE(CONVERT(VARCHAR, GETDATE(), 108), ':', '')) - 路径必须用 SQL Server 可达路径(同上),不能用客户端路径
- 保存查询后,在“自动运行”里建批作业,把该查询拖进去,再设任务计划(如每天 2:00)
- 若需异地备份,得提前在 SQL Server 上用
xp_cmdshell或 Windows 计划任务配合robocopy把.bak拷走——Navicat 本身不负责传输
很多人以为“设置触发器”就能自动异地备份,其实 Navicat 只负责触发 SQL Server 写本地 .bak,后续搬运得另配机制。


















