我有一个bak文件,里面备份了一个数据库。
我想将这个数据库恢复到一个新的位置,并且需要从这个文件中获取数据库名称。有什么办法可以做到吗?
我需要覆盖数据文件位置和日志文件位置。
感谢您的帮助。
我有一个bak文件,里面备份了一个数据库。
我想将这个数据库恢复到一个新的位置,并且需要从这个文件中获取数据库名称。有什么办法可以做到吗?
我需要覆盖数据文件位置和日志文件位置。
感谢您的帮助。
RESTORE FILELISTONLY
FROM DISK = 'full path to your .bak file'
该命令将显示备份中当前文件的名称。如果一个文件中有多个备份并且您没有指定“WITH FILE = X
”,则只会获取该文件中第一个备份的信息。
RESTORE DATABASE MyNewDBname
FROM DISK = 'full path to your .bak file'
WITH
MOVE 'LogicalFilename_Data' TO 'D:\somepath\...\MyDB.mdf',
MOVE 'LogicalFilename_Log' TO 'D:\somepath\...\MyDB.ldf';
GO
使用SMO的大致概述(未经测试):
Restore restoreDB = new Restore();
restoreDB.Database = myDatabase.Name;
// Specify whether you want to restore database, files or log
restoreDB.Action = RestoreActionType.Database;
restoreDB.Devices.AddDevice(@"D:\somepath\...\MyDBFull.bak", DeviceType.File);
restoreDB.ReplaceDatabase = true; // will overwrite any existing DB
restoreDB.NoRecovery = true;
// you can Wire up events for progress monitoring */
// restoreDB.PercentComplete += CompletionStatus;
// restoreDB.Complete += RestoreCompleted;
restoreDB.SqlRestore(myServer);
参考。
使用SMO,您可以使用Restore.ReadFileList检索文件列表
另请参阅:如何从C#还原数据库。
我能够以一种非常不稳定和“hacky”的方式获取数据库的名称。然而,这对我来说确实很有效,并且我只是在一个小的测试和开发工具中自用。
如果你跟随Mitch Wheat的答案,你需要执行以下操作:
在此之后
restoreDB.Devices.AddDevice(@"D:\somepath\...\MyDBFull.bak", DeviceType.File);
var fileList = restoreDB.ReadFileList(myServer);
string databaseName = fileList.Rows[0].ItemArray[0].ToString();
restoreDB.Database = databaseName;
只需尝试以下操作:
DECLARE @BackUpPath nvarchar(2000)='X:\YourBackUpFileName.bak'
EXEC('RESTORE FILELISTONLY FROM DISK=''' +@BackUpPath+ ''' ')
而 X 是包含备份文件的驱动器。