Restore

恢復數據庫,將 ldf 和 mdf 移動到預設位置

  • March 31, 2022

當我嘗試

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列中,如果您在不同的地方有日誌和數據(通常推薦),您可以通過值ROWSLOGin進行區分type_desc。從那裡您需要通過將文件名從找到的完整路徑中取出並將其physical_name替換為新恢復的數據庫的文件名來創建新路徑,並將RESTORE命令構造為要執行的字元串,EXEC (@SQLInVariable)因為您不能使用的MOVE指令中的變數RESTORE

此外,如果您不知道要恢復的數據庫中文件的名稱,您還需要通過擷取的輸出來檢測它們,RESTORE FILELISTONLY因為您也需要這些名稱作為MOVE指令。

因此,我認為您想要的在技術上是可行的,但除非您以這種方式大量恢復數據庫,否則可能比它的價值更麻煩。

引用自:https://dba.stackexchange.com/questions/310337