【问题标题】:Using SMO to restore a database from a .bak file使用 SMO 从 .bak 文件恢复数据库
【发布时间】:2013-09-18 21:12:53
【问题描述】:

我尝试了一些解决方案,以下是最直接的解决方案,但我收到以下错误

逻辑文件“RestoredProcessMananger”不是数据库“RestoredProcessMananger”的一部分。使用 RESTORE FILELISTONLY 列出逻辑文件名。

RESTORE DATABASE 异常终止。

我做错了什么?这个想法是创建 DLL 以供其他程序使用,允许在服务器上重新加载基线数据库,覆盖那里的任何内容..

   ServerConnection connection = new ServerConnection("xxx", "sa", "srv$xxx");
   Server svr =new Server(connection);
   Restore res = new Restore();
   res.Database = "RestoredProcessMananger";
   res.Action = RestoreActionType.Database;
   res.Devices.AddDevice(@"C:\temp\ProcessManager.bak", DeviceType.File);
   res.ReplaceDatabase = true;

   res.RelocateFiles.Add(new RelocateFile("RestoredProcessMananger", _
          @"c:\ProcessManager2.mdf"));
   res.RelocateFiles.Add(new RelocateFile("RestoredProcessMananger_Log", _
          @"c:\ProcessManager2_log.ldf"));

   res.SqlRestore(svr);
   svr.Refresh();

编辑 1:已修复

 public static void RestoreDatabase(string Server, //sqlserver //from CONFIG
        string BackupFilePath, //where the bak file I want to restore  //from CONFIG
        string destinationDatabaseName, //what the restored database will be called //from CONFIG
        string DatabaseFolder, //where the data/log files for the destination (break into 2 variables (2 different locations)) (get from GetDatabaseMDFFilePathName)
        string DatabaseFileName, //the destination MDF file name (get from GetDatabaseMDFFilePathName)
        string DatabaseLogFileName) //the destination LDF file name (get from GetDatabaseMDFFilePathName)
    {
        Server myServer = GetDatabases("xxx");
        Restore myRestore = new Restore();
        myRestore.Database = destinationDatabaseName;
        Database currentDb = myServer.Databases[destinationDatabaseName];
        if (currentDb != null)
            myServer.KillAllProcesses(destinationDatabaseName);
        myRestore.Devices.AddDevice(BackupFilePath, DeviceType.File);
        string DataFileLocation = DatabaseFolder + "\\" + destinationDatabaseName + ".mdf";
        string LogFileLocation = DatabaseFolder + "\\" + destinationDatabaseName + "_log.ldf";
        myRestore.RelocateFiles.Add(new RelocateFile(DatabaseFileName, DataFileLocation));
        myRestore.RelocateFiles.Add(new RelocateFile(DatabaseLogFileName, LogFileLocation));
        myRestore.ReplaceDatabase = true;
        myRestore.PercentCompleteNotification = 10;
        myRestore.SqlRestore(myServer);
        currentDb = myServer.Databases[destinationDatabaseName];
        currentDb.SetOnline();
    }

【问题讨论】:

  • 现在我有相同的用户.. 相同的 DB.. 不同的服务器(2008 年而不是 2012 年),现在它不起作用并在这条线上崩溃 Database db = smoServer.Databases[databaseName];。 ....知道为什么除了数据库服务器版本之外的所有内容都相同会破坏这个吗?

标签: sql-server restore smo


【解决方案1】:

错误表明RestoredProcessMananger 不是备份文件中包含的逻辑文件的名称。

您是否使用RESTORE FILELISTONLY ... 列出了 .BAK 文件中包含的文件?

例如,如果您的备份文件名为 C:\MyBackupFile.bak,则需要从 SQL Server Management Studio(或 SQLCMD 等)运行以下查询:

RESTORE FILELISTONLY FROM DISK='C:\MyBackupFile.bak';

这将提供备份文件中包含的逻辑文件的列表。然后,您需要将其中一个文件的名称传递到您的 RelocateFile 代码中。

【讨论】:

  • 好的..我非常不了解代码中发生了什么.. bak 文件与 MDF 文件的关系与实际数据库的关系。 ..我有一个工作版本,似乎可以恢复到现有数据库或创建一个新数据库(如果不存在)。所以现在需要将其设为 DLL 并让它接受来自外部的一些参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多