![](/img/trans.png)
[英]SQL-Server: Error - Logical file is not part of database. Use RESTORE FILELISTONLY to list the logical file names
[英]Getting the Logical File Name using RESTORE FILELISTONLY from a DB backup and storing it into a variable
我正在使用一個相當簡單的 PowerShell 腳本來自動化恢復數據庫的過程:
#Script to restore database.
$serverInstance = $args[0]
$dbName = $args[1]
$file = $args[2]
$dataDestination = $args[3]
$logDestination = $args[4]
Import-Module sqlps
$relocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile(###LOGICALFILENAME###, $dataDestination)
$relocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile(###LOGICALFILENAME###, $logDestination)
Restore-SqlDatabase -ServerInstance $serverInstance -Database $dbName -BackupFile $file -RelocateFile @($relocateData,$relocateLog)
我正在尋找一種方法來動態獲取數據庫備份($file)中包含的文件的邏輯文件名並將它們存儲到一個變量中,以便可以相應地重命名。
有人有想法么? 我一直在努力解決這個問題太久了::)
謝謝你的幫助!
與 Powershell 和 SQL 服務器一樣, 調用-Sqlcmd 是您的朋友。 它返回一個易於導航的 DataTable。 例如
$dt = Invoke-Sqlcmd "restore filelistonly from disk='c:\temp\aw.bak'"
$dataFileLogicalName = ""
$logFileLogicalName = ""
foreach ($r in $dt)
{
if ($r.Type -eq "L")
{
$logFileLogicalName = $r.LogicalName
}
if ($r.Type -eq "D")
{
$dataFileLogicalName = $r.LogicalName
}
write-host "$($r.Type) $($r.LogicalName) $($r.PhysicalName)"
}
write-host "data=$dataFileLogicalName log=$logFileLogicalName"
好的,我遇到了類似的錯誤。 但就我而言,我沒有使用 PowerShell,而是在 SSMS 中運行它。
因此,問題的步驟以及解決方法如下。
首先,我從這里的版本下載了 WideWorldImporters-Standard.bak 文件。
現在我在 SSMS 中運行以下命令來嘗試恢復它。
RESTORE DATABASE WideWorldImporters FROM DISK = N'C:\Users\msi\Downloads\WideWorldImporters-Standard.bak'
這給出了以下錯誤。
Msg 5133, Level 16, State 1, Line 2
Directory lookup for the file "D:\Data\WideWorldImporters.mdf" failed with the operating system error 3(The system cannot find the path specified.).
Msg 3156, Level 16, State 3, Line 2
File 'WWI_Primary' cannot be restored to 'D:\Data\WideWorldImporters.mdf'. Use WITH MOVE to identify a valid location for the file.
Msg 5133, Level 16, State 1, Line 2
Directory lookup for the file "D:\Data\WideWorldImporters_UserData.ndf" failed with the operating system error 3(The system cannot find the path specified.).
Msg 3156, Level 16, State 3, Line 2
File 'WWI_UserData' cannot be restored to 'D:\Data\WideWorldImporters_UserData.ndf'. Use WITH MOVE to identify a valid location for the file.
Msg 5133, Level 16, State 1, Line 2
Directory lookup for the file "E:\Log\WideWorldImporters.ldf" failed with the operating system error 3(The system cannot find the path specified.).
Msg 3156, Level 16, State 3, Line 2
File 'WWI_Log' cannot be restored to 'E:\Log\WideWorldImporters.ldf'. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Line 2
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.
所以現在我將命令更改為包含 mdf 和 ldf 文件路徑,如下所示。
RESTORE DATABASE WideWorldImporters FROM DISK = N'C:\Users\msi\Downloads\WideWorldImporters-Standard.bak' WITH
MOVE 'WideWorldImporters' TO 'C:\Users\msi\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB\WideWorldImporters.mdf'
,
MOVE 'WideWorldImporters_Log' TO 'C:\Users\msi\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB\WideWorldImporters_Log.ldf'
現在這給了我有問題的錯誤,如下所示。
Msg 3234, Level 16, State 2, Line 5
Logical file 'WideWorldImporters' is not part of database 'WideWorldImporters'. Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 5
RESTORE DATABASE is terminating abnormally.
現在我按照建議運行 RESTORE FILELISTONLY 命令以獲取如下列表。
這向我顯示了文件以及路徑,如下所示。
LogicalName PhysicalName Type FileGroupName Size MaxSize FileId CreateLSN DropLSN UniqueId ReadOnlyLSN ReadWriteLSN BackupSizeInBytes SourceBlockSize FileGroupId LogGroupGUID DifferentialBaseLSN DifferentialBaseGUID IsReadOnly IsPresent TDEThumbprint SnapshotUrl
-------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- -------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- --------------------------------------- --------------------------------------- ------------------------------------ --------------------------------------- --------------------------------------- -------------------- --------------- ----------- ------------------------------------ --------------------------------------- ------------------------------------ ---------- --------- ------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
WWI_Primary D:\Data\WideWorldImporters.mdf D PRIMARY 1073741824 35184372080640 1 0 0 8D30F4F9-A463-404F-805A-9BD1C634B66B 0 0 11730944 512 1 NULL 623000001720300037 C6D12B8E-E389-4961-ADD4-FE6E468F4E44 0 1 NULL NULL
WWI_UserData D:\Data\WideWorldImporters_UserData.ndf D USERDATA 2147483648 35184372080640 3 37000000095200001 0 28D406E0-78FF-4400-9A4B-3A05D136B1F3 0 0 580124672 512 2 NULL 623000001720300037 C6D12B8E-E389-4961-ADD4-FE6E468F4E44 0 1 NULL NULL
WWI_Log E:\Log\WideWorldImporters.ldf L NULL 104857600 2199023255552 2 0 0 6AC6807E-8774-415B-8EFC-E8C569B0855E 0 0 0 512 0 NULL 0 00000000-0000-0000-0000-000000000000 0 1 NULL NULL
(3 rows affected)
Completion time: 2022-08-28T15:36:18.5341906+05:30
現在在記下 output 之后,我修改 RESTORE 命令以包含所有必需的文件和路徑,如下所示。 這終於奏效了。
RESTORE DATABASE WideWorldImporters FROM DISK = N'C:\Users\msi\Downloads\WideWorldImporters-Standard.bak' WITH
MOVE 'WWI_Primary' TO 'C:\Users\msi\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB\WideWorldImporters.mdf'
, MOVE 'WWI_Log' TO 'C:\Users\msi\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB\WideWorldImporters_Log.ldf'
, MOVE 'WWI_UserData' TO 'C:\Users\msi\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB\WideWorldImporters_UserData.ndf'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.