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

问题描述 投票:5回答:2

我有一个bak文件,其中有一个数据库的备份。

我想把这个数据库恢复到一个新的位置,我需要从这个文件中检索数据库名称,任何想法如何做到这一点?

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

谢谢你的帮助。

c# .net sql-server sql-server-2005 smo
2个回答
11
投票
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,你可以使用以下方法检索文件列表。还原.读取文件列表

另请参阅。如何从C#中恢复数据库


0
投票

我能够以一种感觉上很黑且不确定的方式获得数据库的名称。然而,这对我来说真的很有效,反正我只是在一个小型测试和开发工具中使用,只是为了自己。

如果你按照和Mitch Wheat一样的答案,你需要做的是以下几点。

紧接着

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;

读取相关文件列表,使用 我的服务器 而你从一个 数据表 和一个 项目数组. 这个名字似乎存在于项目数组的第一行和第一项中。之后,用这个名字来设置 数据库 的财产 恢复 对象。瞧,如果你只是想恢复或切换现有的数据库,那么就不需要提供你自己的数据库名称,因为你已经不记得这些数据库的名称了。

警告:如果你只是想恢复或切换现有的数据库,而这些数据库的名字你已经不记得了,那么你就不需要提供自己的数据库名了。: 只有当你的数据库是在你要还原的同一个实例中创建的时候,这个方法才有效。如果你使用这个方法来还原从其他地方创建和备份的数据库,它将无法工作,因为你可能需要设置更多的属性!你可能会问哪些属性?你得自己去选购里面的。项目数组. 不过,其中一个属性是需要恢复数据库的位置。你也可以在里面找到位置。说的很明显,但要确保数据库曾经所在的文件夹也存在于你的电脑上!我在几个数据库上试了一下,效果不错。

总之,我用几个数据库试了一下,这对我来说是可行的,希望对大家有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.