簡體   English   中英

SQL-Server:錯誤 - 邏輯文件不是數據庫的一部分。 使用 RESTORE FILELISTONLY 列出邏輯文件名

[英]SQL-Server: Error - Logical file is not part of database. Use RESTORE FILELISTONLY to list the logical file names

我制作了一個腳本來 restore.bak 或備份文件。 它適用於某些數據庫,但不適用於一個。 如何使它適用於任何類型的 .bak 文件? 這是在 sql 服務器 2008 中。錯誤消息是 -

Msg 3234, Level 16, State 1, Line 1
Logical file 'Northwind_Data' is not part of database 'Northwind'. 
Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

腳本 -

IF DB_ID('Northwind') IS NULL
BEGIN
RESTORE DATABASE [Northwind]
FILE = N'Northwind_Data'
FROM 
DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'
WITH  FILE = 1,
MOVE N'Northwind_Data'
TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind.mdf',
MOVE N'Northwind_Log'
 TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind_0.LDF',
NOUNLOAD,  STATS = 10
END

請在sql下面運行並檢查邏輯名稱

RESTORE FILELISTONLY 
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'

然后在下面的腳本中替換RESTORE FILELISTONLY顯示的邏輯名稱

--If database already exists do not restore
IF DB_ID('Northwind') IS NULL 
BEGIN
  RESTORE DATABASE [Northwind]
  FILE = N'Northwind_Data'
  FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'
  WITH 
    FILE = 1, NOUNLOAD, STATS = 10,
    MOVE N'YOUR logical name of data file as shown by RESTORE FILELISTONLY command'
    TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind.mdf',
    MOVE N'YOUR logical name of Log file as shown by RESTORE FILELISTONLY command'
    TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind_0.LDF'
END

我在嘗試恢復 MS SQL Server 2012 上的數據庫時遇到了這個問題。

這是我用於恢復數據庫的腳本:

USE master;
GO

ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

    
RESTORE DATABASE my_db
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
    WITH REPLACE,
    MOVE 'my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db.mdf',
    MOVE 'my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db_log.ldf'
GO
    
ALTER DATABASE my_db SET MULTI_USER;
GO

我遇到了錯誤:

Msg 3234, Level 16, State 1, Line 1
Logical file 'my_db' is not part of database 'my_db'. 
Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

這是我修復它的方法

問題是我沒有正確引用邏輯文件。

我必須在備份文件上運行下面的RESTORE FILELISTONLY命令:

RESTORE FILELISTONLY 
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'

這分別顯示了數據庫的數據和日志文件的LogicalName和相應的PhysicalName

LogicalName      PhysicalName               
com.my_db        C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db.mdf
com.my_db_log    C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db_log.ldf

我所要做的就是在腳本中分別替換數據庫的LogicalName和相應的PhysicalName的 Data 和 Log 文件:

USE master;
GO

ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

    
RESTORE DATABASE my_db
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
    WITH REPLACE,
    MOVE 'com.my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db.mdf',
    MOVE 'com.my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db_log.ldf'
GO
    
ALTER DATABASE my_db SET MULTI_USER;
GO

並且數據庫還原任務成功運行:

這篇文章幫助我弄清楚了: SQL 錯誤 – 邏輯文件 'XYZ_Log2' 不是數據庫 'XYZ' 的一部分。 使用 RESTORE FILELISTONLY 列出邏輯文件名。

就這樣。

我希望這有幫助

檢查數據庫屬性並確保邏輯名稱與文件名相同。 使用 Alter Database 命令修改這些:

ALTER DATABASE [Northwind] MODIFY FILE (NAME=N'Northwind_Data', NEWNAME=N'Northwind')
GO
ALTER DATABASE [Northwind] MODIFY FILE (NAME=N'Northwind_Data_log', NEWNAME=N'Northwind_log')
GO

我正在使用 Powershell 來執行此操作,但遇到了同樣的錯誤。 讓我知道的是我使用的是“$db_log.mdf”,下划線是變量定義的有效字符,所以它實際上是在尋找 $db_log 而不是連接。

所以我的代碼是這樣的:

  $db = "MyNewDb"
  $restoreSuffix = "_V1"
  $newDbName = $db
  $dataFileOrigin = $db
  $logFileOrigin = $db+"_log"
  $dataFileLocation = "$dataAndLogFileDestination\$db$restoreSuffix.mdf"
  $logFileLocation = "$dataAndLogFileDestination\$db$restoreSuffix"+"_log.ldf"

  echo "Renaming and Relocating files to ($newDbName)"

  $RelocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("$dataFileOrigin", "$dataFileLocation")
  $RelocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("$logFileOrigin", "$logFileLocation")
  Restore-SqlDatabase -ServerInstance "." -Database "$newDbName" -BackupFile "$backupLocation$db.bak" -RelocateFile @($RelocateData,$RelocateLog)

我試圖從 UNC 路徑上的備份恢復數據庫。 有2個問題:

  1. 數據庫以數字開頭:123DbName 所以這必須用 [] 包裹,如 [123DbName]

  2. 我正在編寫要移動的服務器的完整 UNC 路徑:\\\\server\\e$\\data | \\\\server\\f$\\log,一旦我刪除了服務器部分並只保留了 e 和 f 一切正常。

這個問題可能太老了,但我希望這個答案可以幫助別人。 我今天遇到了一種情況,我必須從 windows 環境創建備份並將其導入 macOS 上的 docker 容器中。

一旦你有了.bak文件,你只需要執行以下 2 個步驟,你的備份應該就可以導入了。

  1. .bak文件中獲取LogicalName
RESTORE FILELISTONLY 
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\YourDB.bak'

  1. 然后你只需要運行以下命令。 (確保在Move關鍵字后替換 LogicalName(單引號))
RESTORE DATABASE medjobs_devCurrent FROM DISK = N'/var/opt/mssql/data/YourDB.bak'
WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf'
, MOVE 'YourDB_log' TO '/var/opt/mssql/data/YourDB_log.ldf'

第 1 步的功勞歸於@Saurabh Sinha。

您要求的不是微不足道的,並且有幾個潛在的陷阱(如果數據庫存在,您想覆蓋它嗎?,如果嘗試覆蓋時數據庫正在使用中怎么辦?您想將物理文件放入一直在同一個目錄?等)。

幸運的是之前有人問過, 看這里,我還沒有測試過,但看起來不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM