错误 - 逻辑文件不是数据库的一部分.使用RESTORE FILELISTONLY列出逻辑文件名

Ste*_*eam 28 sql sql-server sql-server-2008

我制作了一个脚本来恢复.bak或备份文件.它适用于某些数据库,但不适用于某些数据库.如何使其适用于任何类型的.bak文件?这是在sql server 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.
Run Code Online (Sandbox Code Playgroud)

脚本 -

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
Run Code Online (Sandbox Code Playgroud)

Sau*_*nha 68

请在sql下运行并检查逻辑名称

RESTORE FILELISTONLY 
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'
Run Code Online (Sandbox Code Playgroud)

然后替换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
Run Code Online (Sandbox Code Playgroud)

  • 如果在恢复数据库后需要更改逻辑名,请运行`ALTER DATABASE [Northwind] MODIFY FILE(NAME = N'Northwind_Data',NEWNAME = N'YourDatabaseName_Data'); ALTER DATABASE [Northwind] MODIFY FILE(NAME = N'Northwind_log',NEWNAME = N'YourDatabaseName_log');` (2认同)

Pro*_*ton 6

我在尝试恢复 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
Run Code Online (Sandbox Code Playgroud)

我遇到了错误:

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.
Run Code Online (Sandbox Code Playgroud)

这是我修复它的方法

问题是我没有正确引用逻辑文件。

我必须RESTORE FILELISTONLY在备份文件上运行以下命令:

RESTORE FILELISTONLY 
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
Run Code Online (Sandbox Code Playgroud)

这分别显示了数据库的数据和日志文件的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
Run Code Online (Sandbox Code Playgroud)

我所要做的就是在脚本中分别替换数据库的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
Run Code Online (Sandbox Code Playgroud)

并且数据库还原任务成功运行:

这篇文章帮助我弄清楚了:SQL 错误 – 逻辑文件 'XYZ_Log2' 不是数据库 'XYZ' 的一部分。使用 RESTORE FILELISTONLY 列出逻辑文件名。

就这样。

我希望这有帮助