从 bak 文件中检索数据库名称

Posted

技术标签:

【中文标题】从 bak 文件中检索数据库名称【英文标题】:Retrieving database name from bak file 【发布时间】:2011-05-09 18:38:12 【问题描述】:

我有一个包含数据库备份的 bak 文件。

我想将此数据库恢复到一个新位置,我需要从该文件中检索数据库名称,知道该怎么做吗?

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

感谢您的帮助。

【问题讨论】:

【参考方案1】:
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);

Ref.

使用SMO,您可以使用Restore.ReadFileList检索文件列表

另请参阅:How to restore a database from C#

【讨论】:

你没有说你想以编程方式进行。 我正在将数据库恢复到不同的地方,所以我应该覆盖 mdf 和 ldf 文件。为此,我需要从我的 bak 文件中获取数据库名称。我不知道我的 bak 文件中的数据库是什么。 你的第一个链接正是我需要的。【参考方案2】:

我能够以一种非常老套和不确定的方式获得数据库的名称。但是,这对我来说真的很有效,无论如何我只是在一个小型测试和开发工具中使用它。

如果你的答案和米奇小麦一样,你需要做的是:

紧接着

restoreDB.Devices.AddDevice(@"D:\somepath\...\MyDBFull.bak", DeviceType.File);

添加这三行:

var fileList = restore.ReadFileList(myServer);

string databaseName = fileList.Rows[0].ItemArray[0].ToString();

restore.Database = databaseName;

您使用myServer 读取相关文件列表,并从DataTableItemArray 中获取信息。该名称似乎出现在第一行和项目数组的第一项中。之后,使用此名称设置 restore 对象的 Database 属性。瞧,如果您只是想恢复或在您不记得名称的现有数据库之间切换,则无需提供您自己的数据库名称。

警告:这仅适用于您的数据库是在您要恢复它的同一实例中创建的。如果您使用此方法来恢复从其他地方创建和备份的数据库,它将不起作用,因为您可能需要设置更多属性! 您可能会问哪些属性?您将不得不在 ItemArray 中为自己购物。然而,属性之一是数据库需要恢复到的位置。你也可以在那里找到位置。显而易见,但请确保您的计算机上也存在数据库所在的文件夹!

无论如何,我用几个数据库尝试了这个,这对我有用,希望它可以帮助任何人!

【讨论】:

以上是关于从 bak 文件中检索数据库名称的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 中检索具有国际名称的 MS Access 列(编码)

从备份文件bak中识别SQL Server的版本

从备份文件bak中识别SQL Server的版本

如何在 Docker 上的 SQL Server 中从数据库备份中查看 .bak 文件

怎么把sql server 2008 备份文件bak还原?

SQL Server 2012,无法从 .bak 文件还原数据库