Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:错误-逻辑文件不是数据库的一部分。使用RESTORE FILELISTONLY可列出逻辑文件名_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL Server:错误-逻辑文件不是数据库的一部分。使用RESTORE FILELISTONLY可列出逻辑文件名

SQL Server:错误-逻辑文件不是数据库的一部分。使用RESTORE FILELISTONLY可列出逻辑文件名,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我制作了一个脚本来恢复.bak或备份文件。它适用于某些数据库,但不适用于某个数据库。如何使其适用于任何类型的.bak文件?这是在SQLServer2008中。 错误信息为- 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. Ms

我制作了一个脚本来恢复.bak或备份文件。它适用于某些数据库,但不适用于某个数据库。如何使其适用于任何类型的.bak文件?这是在SQLServer2008中。 错误信息为-

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

您所要求的并不是琐碎的,而且有几个潜在的缺陷(如果数据库存在,是否要覆盖它?;如果在尝试覆盖时数据库正在使用,该怎么办?是否要始终将物理文件放在同一目录中?)等等


幸运的是,以前有人问过它,我没有测试过它,但它看起来不错。

检查数据库属性,确保逻辑名称与文件名相同。使用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路径上的备份还原数据库。有两个问题:

  • 数据库以数字开始:123DbName,因此必须用[]包装,如[123DbName]

  • 我正在写我要移动的服务器的完整UNC路径:\\server\e$\data |\\server\f$\log,一旦我删除了服务器部件,只保留了e和f,一切正常


  • 我在尝试在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               
    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

    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
    
    并且数据库还原任务已成功运行:

    这篇文章帮助我弄明白了这一点:

    就这些


    我希望这有帮助

    谢谢。我正在寻找一个简单的脚本来恢复dbs,而不必担心覆盖、正在使用等问题。这对我来说是一个简单的练习。我想知道为什么MS不提供此功能。我得到一个错误-Msg 102,级别15,状态1,第8行“*”附近的语法不正确。Blasto:您必须获取第一个查询“逻辑名称”的输出,并将其放入第二个查询中。**提到这里时,您必须替换逻辑名称。因此,上面的查询“数据文件的逻辑名称”应替换为“第一次查询的输出”。如果你分享你的第一个查询输出,我会告诉你在哪里替换什么。您还可以搜索“使用移动恢复数据库”以获得许多有用的自解释链接。如果在恢复数据库后需要更改逻辑名称,请运行
    ALTER database[Northwind]MODIFY FILE(name=N'Northwind_Data',NEWNAME=N'YourDatabaseName_Data');更改数据库[Northwind]修改文件(NAME=N'Northwind_log',NEWNAME=N'YourDatabaseName_log')此解决方案适合我。需要注意的一点是,您需要在MOVE中输入“逻辑文件名”,而不是“物理文件名”。在代码中如何做到这一点?我有一堆表格,它们随机地给愚蠢的逻辑名称命名。因此,我需要执行select*from(restore filelistonly…),并对数据执行第一个操作,对日志执行第二个操作。但我无法获得还原的输出…这里建议使用免费数据库还原软件: