Sql server SQL Server还原错误:文件“的目录查找”;db.mdf“;失败

Sql server SQL Server还原错误:文件“的目录查找”;db.mdf“;失败,sql-server,tsql,Sql Server,Tsql,尝试在linux计算机上还原SQL Server的dbname.bak文件时,请使用: RESTORE DATABASE dbname FROM DISK = '/path/to/dbname.bak' 我得到了以下错误: 错误:文件“C:\Program Files\Microsoft SQL Server\MSSQL\DATA\dbname.mdf”的目录查找失败,操作系统错误2(系统找不到指定的文件)。 SQLState:S0001 错误代码:5133 还有另一个关于dbname\u l

尝试在linux计算机上还原SQL Server的
dbname.bak
文件时,请使用:

RESTORE DATABASE dbname
FROM DISK = '/path/to/dbname.bak'
我得到了以下错误:

错误:文件“C:\Program Files\Microsoft SQL Server\MSSQL\DATA\dbname.mdf”的目录查找失败,操作系统错误2(系统找不到指定的文件)。
SQLState:S0001
错误代码:5133

还有另一个关于
dbname\u log.ldf
文件的错误


我听说你在问,为什么SQL Server试图引用linux机器上的windows文件?

解释

默认情况下,MS SQL Server假定保存在
dbname.bak
中的文件路径是数据库应还原到的位置。如果文件路径不存在,则会出现类似的错误

解决方案

明确告诉DB使用不同的文件。但首先,您需要知道通过执行以下T-SQL如何引用文件:

RESTORE FILELISTONLY FROM DISK = '/path/to/dbname.bak'
RESTORE DATABASE dbname
FROM DISK = '/path/to/dbname.bak'
WITH MOVE 'Dbname_Empty' TO '/var/opt/mssql/data/dbname.mdf',
MOVE 'Dbname_Empty_log' TO '/var/opt/mssql/data/dbname.ldf'
这可能会给你这样的东西:

Dbname_Empty
Dbname_Empty_log
然后,您可以使用它执行以下T-SQL:

RESTORE FILELISTONLY FROM DISK = '/path/to/dbname.bak'
RESTORE DATABASE dbname
FROM DISK = '/path/to/dbname.bak'
WITH MOVE 'Dbname_Empty' TO '/var/opt/mssql/data/dbname.mdf',
MOVE 'Dbname_Empty_log' TO '/var/opt/mssql/data/dbname.ldf'
希望不会有任何错误