通过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
相关产品推荐
相关产品推荐

