我制作了一个脚本来恢复.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.
脚本 -
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
答案 0 :(得分:58)
请在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
答案 1 :(得分:1)
当我尝试在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 :
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
数据库还原任务成功运行:
仅此而已。
我希望这会有所帮助
答案 2 :(得分:0)
检查数据库属性并确保逻辑名称与文件名相同。使用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
答案 3 :(得分:0)
我正在使用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)
答案 4 :(得分:0)
我正在尝试从UNC路径上的备份还原数据库。有两个问题:
数据库以数字123DbName开头,因此必须用[]包裹,例如[123DbName]
我正在编写要移动的服务器的完整UNC路径:\\ server \ e $ \ data | \\ server \ f $ \ log,一旦我删除了服务器部分并仅保留e和f一切正常。
答案 5 :(得分:-2)
你所要求的并不是微不足道的,并且有几个潜在的缺陷(如果它存在,你想覆盖数据库吗?,当你试图覆盖时数据库正在使用怎么办?你想要把它物理文件一直在同一目录中?等等。)..
幸运的是之前有人问过,look here,我没有测试过,但它看起来很合理。