我的问题基本上在标题中说明,但是我试图扩展它。 我正在尝试备份数据库,然后将该数据库还原到位于同一服务器上的另一个数据库。现在我将它保存在同一台服务器上以进行测试,但我可能需要将其恢复到新服务器。
代码有效,没有错误等。但如果我运行一次,则无法保证恢复的数据库得到更新。如果我运行它可以说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
答案 0 :(得分:3)
问题是您使用的是SqlRestoreAsync(Server)
。 SqlRestoreAsync(Server)
是非阻止函数,通过侦听Restore
类上的事件,您会收到通知已完成还原的通知。因此,您无法收到任何发生的错误的通知(在恢复过程中调用serverConn.Disconnect()
可能也无济于事。)
将SqlRestoreAsync(Server)
替换为SqlRestore(Server)
,以便它在代码行上停止,直到还原完成或重写代码,这样就不会关闭连接并在{{3}上拥有事件侦听器}和Complete
找出任何错误或成功的状态。
P.S。您也应该将SqlBackupAsync
替换为SqlBackup
,原因相同,您无法判断备份是否失败,也不知道备份何时完成处理。我打赌钱会发生什么,你正在开始备份,然后在备份运行时你尝试恢复它失败了。然后,当您第二次尝试备份和还原失败时(备份仍在使用该文件)。最后你很幸运,你在6或7次运行之前的备份完成后点击恢复,然后它最终开始恢复你的数据库。