You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Windows命令行导入.bak文件到SQL Server报语法错误如何解决

核心错误原因

你使用的sqlcmd参数-i的作用是指定纯文本格式的SQL脚本文件执行,而.bak是SQL Server的二进制备份文件,不属于可被sqlcmd解析的SQL文本,因此读取到二进制内容时会直接抛出语法错误。你通过SSMS可以正常恢复,是因为SSMS调用的是专门的备份还原接口,不是把bak当脚本执行。

正确操作步骤
  • 第一步:先查询备份文件内的逻辑文件名,方便后续指定还原路径。你可以先创建一个query_filelist.sql脚本,内容如下:
RESTORE FILELISTONLY
FROM DISK = 'C:\Program Files\Microsoft SQL Server\myfiles\mybackup.bak';

执行命令:

sqlcmd -S "MyComputer\MyServer" -U myuser -P mypass -i "C:\脚本路径\query_filelist.sql"

返回结果的LogicalName列就是备份中数据文件、日志文件对应的逻辑名称,记录下这两个名称。

  • 第二步:创建还原用的SQL脚本restore_db.sql,内容示例:
-- 可选:如果目标数据库已存在,先设置为单用户模式断开所有连接
ALTER DATABASE 你的目标数据库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

RESTORE DATABASE 你的目标数据库名
FROM DISK = 'C:\Program Files\Microsoft SQL Server\myfiles\mybackup.bak'
WITH
  -- 替换成你上一步查到的两个逻辑文件名,以及你要存放数据、日志文件的实际路径
  MOVE '你查到的数据文件逻辑名' TO 'C:\SQLData\你的目标数据库名.mdf',
  MOVE '你查到的日志文件逻辑名' TO 'C:\SQLLog\你的目标数据库名.ldf',
  REPLACE, -- 仅在需要覆盖已存在的同名数据库时添加该参数
  STATS = 5; -- 每完成5%输出一次进度

-- 恢复完成后改回多用户模式
ALTER DATABASE 你的目标数据库名 SET MULTI_USER;
  • 第三步:执行还原脚本,命令如下:
sqlcmd -S "MyComputer\MyServer" -U myuser -P mypass -i "C:\脚本路径\restore_db.sql"
注意事项
  • 确保SQL Server服务的运行账号,拥有bak文件所在目录的读取权限,以及你要存放mdf、ldf文件目录的写入权限,否则会抛出权限不足的错误。
  • 如果不需要覆盖已存在的数据库,删除REPLACE参数,避免误操作覆盖数据。

内容的提问来源于stack exchange,提问作者Werner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:39:03