从bak文件中获取数据库名称

7

我有一个bak文件,里面备份了一个数据库。

我想将这个数据库恢复到一个新的位置,并且需要从这个文件中获取数据库名称。有什么办法可以做到吗?

我需要覆盖数据文件位置和日志文件位置。

感谢您的帮助。

3个回答

13
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#还原数据库


1
你没有说你想以编程方式完成它。 - Mitch Wheat
我正在将一个数据库恢复到另一个位置,因此我应该覆盖mdf和ldf文件。为了这样做,我需要从我的bak文件中获取数据库名称。我不知道我的bak文件中包含哪个数据库。 - Night Walker
你的第一个链接正是我需要的。 - Night Walker

2

我能够以一种非常不稳定和“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;

使用myServer读取相关文件列表,从DataTableItemArray获取信息。名称似乎在第一行和项目数组的第一项中都出现了。然后,使用此名称设置restore对象的Database属性。即可恢复或在已存在的数据库之间切换而不需要提供自己的数据库名称,如果您不太记得它们的名称。 警告:仅当要恢复的数据库是在同一实例中创建时才有效。如果您使用此方法恢复从其他位置创建和备份的数据库,则无法使用,因为您可能需要设置更多属性! 您可能会问是哪些属性?你需要在ItemArray内自己查找。尽管如此,其中一个属性是要将数据库还原到的位置。您也可以在其中找到位置。显而易见,但请确保要恢复的数据库所在的文件夹也存在于计算机上!
总之,我尝试了几个数据库,这对我很有效,并希望能帮助任何需要的人!

0

只需尝试以下操作:

DECLARE @BackUpPath nvarchar(2000)='X:\YourBackUpFileName.bak'
EXEC('RESTORE FILELISTONLY  FROM DISK=''' +@BackUpPath+ '''  ')

而 X 是包含备份文件的驱动器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接