将 .Bak 文件还原到不同的服务器

The*_*war 6 sql-server backup

我将一些数据库备份从一台服务器复制到另一台服务器(新实例不存在数据库)。我尝试使用以下命令进行恢复

Restore database dbname
from disk='g:\e2bak\dbname.bak'
with 
stats=10
Run Code Online (Sandbox Code Playgroud)

它因以下错误而失败

文件“G:\MSSQL$s73g\MDF\dbname.mdf”的目录查找失败,出现操作系统错误 3(系统找不到指定的路径。)消息 3156,级别 16,状态 3,第 1 行

服务器级别的默认数据库设置也是存储数据和登录

G:\MSSQL10_50.SG\MSSQL
Run Code Online (Sandbox Code Playgroud)

我可以通过指定移动选项来克服错误。但我的困惑是

1.Why database .bak file is looking for G:\MSSQL$s73g\MDF\dbname.mdf",this is the path
  of dbname database files in production from where we copied the .bak file

2.Also when I restored the database with move option and took a backup in same server,
  I was able to restore the Database with below command

Restore database dbname 
from disk='G:\e1ebk\dbname.bak'
with replace,stats=10
Run Code Online (Sandbox Code Playgroud)

你能帮我理解为什么 .Bak 文件位置指向某个其他目录(它甚至不存在于我们的服务器中,只存在于生产服务器上),以及在第二种情况下为什么这在没有移动选项的情况下有效。

Rub*_*der 6

当您进行备份时,包括文件路径在内的所有信息都包含在备份中。正如您发现的那样,如果您只运行还原数据库,它将尝试还原到完全相同的位置。

当您包含和替换时,备份会覆盖现有的 .mdf 和 .ldf 文件。我通常还有数据和日志路径指令来指定放置文件的位置(在我的手机上将编辑以包含确切的命令)。

这是正常行为,因为如果我在同一台服务器上恢复数据库,您很可能正在从某些东西中恢复并且希望 db 文件相同。

编辑:这是我的正常恢复命令,无论是在同一台服务器上还是在不同服务器上。我喜欢具体说明事情的发展方向。

RESTORE DATABASE dbName
   FROM DISK = N'Path\To\Backup.bak'
   WITH MOVE 'dbName_DataFileLogicalName' TO 'Path\To\Data.mdf',
        MOVE 'dbName_LogFileLogicalName' TO 'Path\To\Log.ldf',
       REPLACE,
       STATS = 10
Run Code Online (Sandbox Code Playgroud)

通过始终指定我正在写入的文件,可以消除一些不确定性,并且当有人来查看时,很清楚发生了什么。