SQL Server备份 – 在实例之间转移

我在一家开发商店工作,我们主要使用SQL Server进行日常的开发和testing。

有时问题出现在我想在我的机器上重现的某人的机器上,通常是一个labtop。 因此,我想将他们的数据库传输到我的机器上。 这种转移通常是离线的,因为在其他地方,所以我们转储数据库,将它们FTP并恢复,所以在线传输机制通常是不可用的。 通常有5 +转储文件来恢复。

目前的过程是使用backup database + restore database并传递转储文件。 这工作正常,但是由于存储在备份中的物理名称,这是一个真正的痛苦。 在进行还原时,我必须将逻辑文件映射到备份文件, with move其映射到我机器上mdf / ldf文件的物理位置。

鉴于SQL Server知道创build这些文件的默认位置,因为create database工作是这样的,有什么办法,我可以想出一个更聪明的方式将这些dbs从一个实例移动到另一个? 如果数据库名称完全相同(如果可以从转储文件中抓取),那么我将非常高兴,物理位置将从目标实例的默认值中推断出来。

注意 :旁边的pipe理工作室恢复选项(GUI)似乎是足够聪明的pipe理,而不必手动详细的物理位置。

SQL实例的默认文件夹存储在服务器的registry中

 HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\[your specific instance ID]\MSSQLServer 

你可以使用xp_regread来获取这个值,然后在你的恢复脚本中使用它。 这是一个例子:

 DECLARE @DataDirectory VARCHAR(255) DECLARE @LogDirectory VARCHAR(255) EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key='SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer', @value_name='DefaultData', @DataDirectory=@DataDirectory OUTPUT EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key='SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer', @value_name='DefaultLog', @LogDirectory=@LogDirectory OUTPUT RESTORE DATABASE MyDB FROM DISK = 'X:\SQLBackups\MyDB.bak' WITH MOVE 'MyDB_Data' TO @DataDirectory + 'MyDB.mdf', MOVE 'MyDB_Log' TO @LogDirectory + 'MyDB.ldf'; 

您将用您正在执行还原的服务器实例的实例IDreplaceMSSQL10_50.MSSQLSERVER。

更简单的方法是使用xp_instance_regread ,它会自动识别正在处理的服务器实例的实例ID。 所以上面的内容会被改写成这样:

 DECLARE @DataDirectory nvarchar(255) DECLARE @LogDirectory nvarchar(255) EXEC master..xp_instance_regread @rootkey=N'HKEY_LOCAL_MACHINE', @key=N'Software\Microsoft\Microsoft SQL Server\MSSQLServer', @value=N'DefaultData', @DataDirectory=@DataDirectory OUTPUT EXEC master..xp_instance_regread @rootkey=N'HKEY_LOCAL_MACHINE', @key=N'Software\Microsoft\Microsoft SQL Server\MSSQLServer', @value=N'DefaultLog', @LogDirectory=@LogDirectory OUTPUT RESTORE DATABASE MyDB FROM DISK = 'X:\SQLBackups\MyDB.bak' WITH MOVE 'MyDB_Data' TO @DataDirectory + 'MyDB.mdf', MOVE 'MyDB_Log' TO @LogDirectory + 'MyDB.ldf'; 

(注意:我在这里使用SQL Server 2008 R2)

关于移动数据库,您可以从数据源分离数据库,然后将物理数据和日志文件复制到目标位置,然后将其重新附加到目标位置(以及在源计算机上)。 我个人更喜欢备份/恢复过程,特别是如果您处于需要ftp来执行文件传输的位置。

你甚至可以设置复制,镜像或日志传送,但我认为这将是矫枉过正。 我会坚持备份/恢复方法。