恢復數據庫,將 ldf 和 mdf 移動到預設位置
當我嘗試
RESTORE DATABASE [foo] FROM DISK = 'C:\foo.bak'
恢復過程將嘗試將 dat 並登錄到已完成備份的系統上可用的位置(如 G:\MSSQLDB),但我的電腦上沒有這樣的位置。
因此,我需要移動這些位置,但我只關心有一個有效的位置。我沒有用指定某個位置。
我可以移動到所有通常 ldfs/mdfs 所在的位置嗎?我試圖用 結束命令
WITH MOVE
,但沒有任何運氣。
SERVERPROPERTY
您可以從系統函式中獲取您需要的資訊,然後將MOVE
參數添加到RESTORE
DECLARE @mdfLocation nvarchar(256) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS nvarchar(200)) + 'YourDb.mdf'; DECLARE @mdf sysname = 'LogicalMdfName'; DECLARE @ldfLocation nvarchar(256) = CAST(SERVERPROPERTY('InstanceDefaultLogPath') AS nvarchar(200)) + 'YourDb.ldf'; DECLARE @ldf sysname = 'LogicalLdfName'; DECLARE @dbName sysname = 'foo'; DECLARE @bak nvarchar(256) = 'C:\foo.bak'; RESTORE DATABASE @dbName FROM DISK = @bak WITH MOVE @mdf TO @mdfLocation, MOVE @ldf TO @ldfLocation;
注意每個部分是如何
RESTORE
參數化的,它不需要動態 SQL。您甚至可以使用 獲取邏輯文件名
RESTORE FILELISTONLY
,儘管這需要INSERT EXEC
在純 T-SQL 中獲取資訊。如果您甚至不知道要恢復多少文件,那麼您將需要動態 SQL 來獲取
MOVE
參數數量。您仍然可以將實際文件名作為參數傳遞。
這是一個很長的路要走,我不記得
SERVERPROPERTY
可以用來返迴路徑並意識到RESTORE DATABASE
語法的那些部分可以接受變數。有關更簡單的方法,請參閱Charlieface 的答案。沒有辦法要求使用預設值:如果沒有
MOVE
指令,文件會在備份時轉到它們所在的位置,並且您必須指定一個位置。假設數據庫位於您要使用的位置,您可以從資訊中
sys.database_files
獲取位置。master
完整路徑將在physical_name
列中,如果您在不同的地方有日誌和數據(通常推薦),您可以通過值ROWS
或LOG
in進行區分type_desc
。從那裡您需要通過將文件名從找到的完整路徑中取出並將其physical_name
替換為新恢復的數據庫的文件名來創建新路徑,並將RESTORE
命令構造為要執行的字元串,EXEC (@SQLInVariable)
因為您不能使用的MOVE
指令中的變數RESTORE
。此外,如果您不知道要恢復的數據庫中文件的名稱,您還需要通過擷取的輸出來檢測它們,
RESTORE FILELISTONLY
因為您也需要這些名稱作為MOVE
指令。因此,我認為您想要的在技術上是可行的,但除非您以這種方式大量恢復數據庫,否則可能比它的價值更麻煩。