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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: c# .net sql-server sql-server-2005 smo


    【解决方案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 中为自己购物。然而,属性之一是数据库需要恢复到的位置。你也可以在那里找到位置。显而易见,但请确保您的计算机上也存在数据库所在的文件夹!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2020-04-13
      相关资源
      最近更新 更多