繁体   English   中英

SMO Restore并非总是有效

[英]SMO Restore doesn't always work

我的问题基本上是在标题中指出的,但请尝试扩大它。 我正在尝试备份数据库,然后将该数据库还原到位于同一服务器上的另一个数据库。 目前,出于测试目的,我将其保留在同一服务器上,但可能需要将其还原到新服务器上。

该代码有效,没有错误等。 但是,如果我运行一次,则无法保证还原的数据库会得到更新。 如果运行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

问题是您正在使用SqlRestoreAsync(Server) SqlRestoreAsync(Server)是一个非阻塞函数,通过侦听Restore类上的事件,您会收到有关还原已完成的通知。 因此,您不会收到有关发生的任何错误的通知(并且在还原过程中调用serverConn.Disconnect()可能也无济于事)。

无论是更换SqlRestoreAsync(Server)SqlRestore(Server) ,因此将停止在该行的代码,直到恢复完成或重写你的代码,所以你不要关闭连接,并具有事件侦听器的CompleteInformation ,找出状态任何错误或成功。


PS同样,出于相同的原因,您也应该用SqlBackup替换SqlBackupAsync ,您无法判断备份是否失败,也无法知道备份何时完成处理。 我敢打赌,发生的事情是您开始备份,然后在备份运行时尝试还原,但失败。 然后,当您尝试第二次时,备份和还原都将失败(备份仍在使用该文件)。 然后,最终您会很幸运,在从6或7备份运行之前,完成了还原操作,然后单击了还原,然后终于开始还原数据库了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM