2010-01-06 28 views
7

我正在嘗試編寫一個自動恢復數據庫備份的腳本。我知道我可以使用以下還原命令:使用MOVE確定DB RESTORE的SQL數據路徑

RESTORE DATABASE [DBRestoredName] 
FROM DISK = N'C:\path\to\backup.bak' 
WITH FILE = 1, 
MOVE N'DBNAME' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\DBNAME.mdf', 
MOVE N'DBNAME_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\DBNAME.ldf', 
NOUNLOAD 

的問題,這是我希望能夠確定SQL服務器的數據位置(即TO路徑)在運行時間,以便還原的數據庫置於與此服務器上的其他數據庫一致。

正在恢復的服務器上不存在正在恢復的數據庫,並且我需要MOVE語句,因爲源服務器很可能是SQL Server 2005,目標是2008,因此備份文件中包含的文件路徑是不可取的。

那麼我可以通過編程來確定SQL數據位置?

回答

2

唯一可行的解​​決方案,我發現正在檢查從你的T-SQL代碼,註冊表:

DECLARE @filepath NVARCHAR(260) 

EXEC master.dbo.xp_instance_regread 
     N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', 
     N'DefaultData', 
     @filepath output, 'no_output' 

SELECT @filepath as 'Your default data directory' 

我可以發誓,數據路徑將存儲在某個地方在SERVERPROPERTY或動態管理視圖(DMV) - 但沒有運氣......

1

您可以從數據庫中的sys.database_files視圖中查詢您希望在物理上一起恢​​復的數據庫。您將必須從physical_name列的末尾剝離文件名稱。

select * from sys.database_files 
+1

但是您使用哪個條目?在我的情況下,我的主/ msdb/model數據庫位於與我的用戶數據庫不同的目錄中.....「 – 2010-01-06 17:25:46

+0

」與其他數據庫一致「是我從問題中解脫出來的。他不一定要問如何找到默認的數據目錄,因爲marc_s指定了解決方案。真的聽起來像2個不同的問題海事組織。在我管理的幾個實例中,出於性能原因,我們必須有多個驅動器來承載不同的數據庫,因此在大多數情況下,這種情況下默認數據目錄是不好的選擇。 – 2010-01-06 21:37:53

+0

對此感到抱歉。這是措辭嚴厲,雖然我真的在默認數據目錄之後,這個答案也是一樣有效,所以我也贊成這一點。謝謝 – Dolbz 2010-01-07 11:24:15

0

下面的代碼片段是我從SQL事件探查器中提取的。我修改了一下以刪除不太有用的列。代碼現在返回一行具有以下colums:

  • IsFullTextInstalled
  • MasterDBLogPath
  • MasterDBPath
  • ErrorLogPath
  • RootDirectory
  • IsCaseSensitive
  • MaxPrecision
  • VERSIONSTRING(例如10.50。 2500.0)
  • 版本(例如開發版(64位))
  • ProductLevel(例如SP1)
  • IsSingleUser
  • EngineEdition(例如3)
  • 歸類(例如Latin1_General_CI_AS)
  • IsClustered
  • NETNAME(如主機名)
  • BuildClrVersionString(如V2.0.50727)

好運。

declare @RegPathParams sysname 
declare @Arg sysname 
declare @Param sysname 
declare @MasterPath nvarchar(512) 
declare @LogPath nvarchar(512) 
declare @ErrorLogPath nvarchar(512) 
declare @n int 

select @n=0 
select @RegPathParams=N'Software\Microsoft\MSSQLServer\MSSQLServer'+'\Parameters' 
select @Param='dummy' 
while(not @Param is null) 
begin 
    select @Param=null 
    select @Arg='SqlArg'+convert(nvarchar,@n) 

    exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', @RegPathParams, @Arg, @Param OUTPUT 
    if(@Param like '-d%') 
    begin 
     select @Param=substring(@Param, 3, 255) 
     select @MasterPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param))) 
    end 
    else if(@Param like '-l%') 
    begin 
     select @Param=substring(@Param, 3, 255) 
     select @LogPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param))) 
    end 
    else if(@Param like '-e%') 
    begin 
     select @Param=substring(@Param, 3, 255) 
     select @ErrorLogPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param))) 
    end 

    select @[email protected]+1 
end 

declare @SmoRoot nvarchar(512) 
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT 

SELECT CAST(FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') AS bit) AS [IsFullTextInstalled], @LogPath AS [MasterDBLogPath], @MasterPath AS [MasterDBPath], @ErrorLogPath AS [ErrorLogPath], @SmoRoot AS [RootDirectory], CAST(case when 'a' <> 'A' then 1 else 0 end AS bit) AS [IsCaseSensitive], @@MAX_PRECISION AS [MaxPrecision], SERVERPROPERTY(N'ProductVersion') AS [VersionString], CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition], CAST(SERVERPROPERTY(N'ProductLevel') AS sysname) AS [ProductLevel], CAST(SERVERPROPERTY('IsSingleUser') AS bit) AS [IsSingleUser], CAST(SERVERPROPERTY('EngineEdition') AS int) AS [EngineEdition], convert(sysname, serverproperty(N'collation')) AS [Collation], CAST(SERVERPROPERTY('IsClustered') AS bit) AS [IsClustered], CAST(SERVERPROPERTY(N'MachineName') AS sysname) AS [NetName], SERVERPROPERTY(N'BuildClrVersion') AS [BuildClrVersionString]