我有一个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,你可以使用以下方法检索文件列表。还原.读取文件列表
另请参阅。如何从C#中恢复数据库
我能够以一种感觉上很黑且不确定的方式获得数据库的名称。然而,这对我来说真的很有效,反正我只是在一个小型测试和开发工具中使用,只是为了自己。
如果你按照和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;
读取相关文件列表,使用 我的服务器 而你从一个 数据表 和一个 项目数组. 这个名字似乎存在于项目数组的第一行和第一项中。之后,用这个名字来设置 数据库 的财产 恢复 对象。瞧,如果你只是想恢复或切换现有的数据库,那么就不需要提供你自己的数据库名称,因为你已经不记得这些数据库的名称了。
警告:如果你只是想恢复或切换现有的数据库,而这些数据库的名字你已经不记得了,那么你就不需要提供自己的数据库名了。: 只有当你的数据库是在你要还原的同一个实例中创建的时候,这个方法才有效。如果你使用这个方法来还原从其他地方创建和备份的数据库,它将无法工作,因为你可能需要设置更多的属性!你可能会问哪些属性?你得自己去选购里面的。项目数组. 不过,其中一个属性是需要恢复数据库的位置。你也可以在里面找到位置。说的很明显,但要确保数据库曾经所在的文件夹也存在于你的电脑上!我在几个数据库上试了一下,效果不错。
总之,我用几个数据库试了一下,这对我来说是可行的,希望对大家有所帮助!