SMO恢复并不总是有效

本文关键字:有效 恢复 SMO | 更新日期: 2023-09-27 18:06:53

我的问题基本上在标题中说明了,但我会尝试扩展它。我正在尝试备份数据库,然后将该数据库恢复到位于同一服务器上的另一个数据库。现在我将其保存在同一台服务器上用于测试,但我可能需要将其恢复到新服务器上。

代码工作正常,没有错误之类的。但是如果我运行一次,不能保证恢复的数据库得到更新。如果我运行它5次,它很可能会更新数据库。

我只是想知道为什么它不立即更新?

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System;
// This program is used to perform a full database backup. The code also includes a SMO      restore as well
namespace BackupDB
{
    class Program
    {
        static void Main(string[] args)
        {
            // Connecting to the server
            ServerConnection serverConn = new ServerConnection(@"T520-R9K0H1K'SQLEXPRESS");
            Server server = new Server(serverConn);
            backup(serverConn, server);
            restore(serverConn, server);
            Console.WriteLine("Closing Application");
            Environment.Exit(0);
        } // Main
        public static void backup(ServerConnection serverConn, Server server)
        {
            if (!serverConn.IsOpen)
            {
                serverConn.Connect();
            }
            Backup bkpDBFull = new Backup();
            bkpDBFull.Action = BackupActionType.Database;
            bkpDBFull.Database = "databaseTest";
            BackupDeviceItem bkpDevice = new BackupDeviceItem(@"C:'BakFiles'test.bak", DeviceType.File);
            bkpDBFull.Devices.Add(bkpDevice);
            bkpDBFull.BackupSetName = "databaseTest Backup";
            bkpDBFull.BackupSetDescription = " databaseTest - Full Backup";
            bkpDBFull.NoRecovery = false;
            bkpDBFull.Initialize = true;
            try
            {
                bkpDBFull.SqlBackupAsync(server);
                Console.WriteLine("Backup Complete");
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                Console.Write(ex.Source);
            }
            finally{ serverConn.Disconnect(); }
        } // Backup
        public static void restore(ServerConnection serverConn, Server server)
        {
            if (!serverConn.IsOpen)
            {
                serverConn.Connect();
            }
            Restore destination = new Restore();
            destination.Action = RestoreActionType.Database;
            destination.ReplaceDatabase = true;
            destination.Database = "RestoreDB";
            BackupDeviceItem source = new BackupDeviceItem(@"C:'BakFiles'test.bak", DeviceType.File);
            destination.Devices.Add(source);
            destination.NoRecovery = false;
            destination.RelocateFiles.Add(new RelocateFile("databaseTest", @"C:'Restored'test.mdf"));
            destination.RelocateFiles.Add(new RelocateFile("databaseTest_Log", @"C:'Restored'test_log.ldf"));
            try
            {
                destination.SqlRestoreAsync(server);
                Console.WriteLine("Restore Complete");
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                Console.Write(ex.Source);
            }
            finally{ serverConn.Disconnect(); } 
        } // Restore
    } // Class
} // Namespace

SMO恢复并不总是有效

问题是您正在使用SqlRestoreAsync(Server)SqlRestoreAsync(Server)是一个非阻塞函数,通过监听Restore类上的事件,您会得到恢复完成的通知。因此,您不会收到发生的任何错误的通知(并且在恢复过程中调用serverConn.Disconnect()可能也没有帮助)。

SqlRestore(Server)替换SqlRestoreAsync(Server),这样它就会停止在那行代码上,直到恢复完成,或者重写你的代码,这样你就不会关闭连接,并在CompleteInformation上有事件侦听器,以找出任何错误或成功的状态。


注:出于同样的原因,您也应该将SqlBackupAsync替换为SqlBackup,因为您无法判断备份是否失败,也不知道备份何时完成处理。我敢打赌,发生的事情是你正在启动备份,然后当备份运行时,你试图恢复,它失败了。然后,当您第二次尝试备份和恢复时,备份和恢复都失败了(该文件仍在备份中使用)。最后,你很幸运,在6或7次运行前的备份完成后,你点击了恢复,然后它最终开始恢复你的数据库。