在数据库管理中,备份操作是至关重要的一环。为了确保数据的安全性和完整性,定期进行数据库备份是必要的。本文将介绍如何使用C#进行异步SQL备份操作,同时接收进度、消息、错误和完成通知。这种方式不仅可以避免在备份过程中阻塞数据库操作,还可以让用户在不知情的情况下进行备份,因为备份文件将默认放置在SQL服务器的默认备份文件夹中。
使用此类进行备份非常简单,只需两行代码:
C#
SQLBackup sb =
new
SQLBackup(
"
Data Source=myServerAddress;
User Id=myUsername;Password=myPassword"
,
"
databaseName"
);
sb.BeginBackup();
上述代码将启动一个异步进程来备份数据库。可以通过使用Running属性来检查备份是否完成。此外,还有三个事件可以供线程订阅:
C#
sb.BackupProgress +=
delegate
(
object
sender, SQLBackup.BackupProgressEventArgs e) { }
sb.BackupFinished +=
delegate
(
object
sender, EventArgs e) { }
sb.BackupMessage +=
delegate
(
object
sender, SQLBackup.BackupMessageEventArgs e) { }
BackupProgress事件将在备份运行时每半秒触发一次,并通过BackupProgressEventArgs变量传递一个百分比。BackupFinished事件将在备份完成后触发一次。如果备份过程中遇到错误,它也会触发。BackupMessage事件将在SqlConnection接收到信息消息或发生错误时触发。如果发生错误,Error将为true。InnerException可能包含一个异常或null。
有几个属性允许控制SQLBackup类。这些属性在备份运行时是只读的。
C#
sb.ConnectionString =
"
Data Source=myServerAddress;
User Id=myUsername;Password=myPassword"
;
sb.Database =
"
databaseName"
;
sb.BackupFileName =
"
TestBackupFile.bak"
;
sb.Compression =
false
;
sb.CopyOnly =
true
;
Console.WriteLine(sb.Running.ToString());
BackupFileName属性将用于备份命令。这可以是数据库服务器上的路径,UNC路径(如果SQL服务器和目标上设置了适当的权限),或者只是一个文件名。如果属性设置为null,则将根据数据库名称和备份的日期/时间自动生成一个文件名。Compression属性将尝试使用SQL备份压缩选项。此选项仅在2008及更高版本中有效,不能在Express版本上使用。ConnectionString属性将允许更改SQLBackup实例的连接字符串。如果此连接字符串包含一个数据库,它将更改Database属性,然后将主数据库存储在连接字符串中。CopyOnly属性将尝试使用SQL Copy-Only Backup选项。此选项将在不中断先前备份的情况下备份数据库,并且不会将事务日志提交到数据库中(就像没有copy-only的完整备份将做的那样)。Database属性将更改要备份的数据库。Running属性如果线程正在运行,则为true;如果线程未运行,则为false。
SQLBackup类中有两个方法。第一个将允许阻塞当前线程,直到备份完成。第二个将允许强制终止备份进程。
C#
sb.BeginBackup();
//
sb.Running == true
Thread.Sleep(
2000
);
//
等待2秒钟
sb.EndBackup();
//
强制结束备份。
//
备份可能不会立即退出,可以选择阻塞
//
线程直到它完成。
sb.BlockUntilFinished();
//
sb.Running == false
惊讶地发现,没有人有一个通常的好方法来确定SQL备份的进度。决定为另一个项目编写这个类,该项目需要在执行架构比较更新之前备份SQL数据库。在StackOverflow上搜索了一番,直到偶然发现了Remus Rusanu的这个回复。这个帖子帮助弄清楚了想如何构建这个类。