使用相对文件路径和进度备份 SQL Server
这个类将允许您异步备份数据库,同时获取进度、消息和错误通知。
引言
本文提供的类将允许您在不阻塞(即异步)的情况下执行 SQL 备份操作,同时接收进度、消息、错误和完成通知。它还将允许您无需了解 SQL Server 的环境,默认使用相对备份文件名。备份文件将被放置在 SQL Server 的默认备份文件夹中。
Using the Code
使用该类执行备份就像两行代码一样简单
SQLBackup sb = new SQLBackup("Data Source=myServerAddress;
User Id=myUsername;Password=myPassword", "databaseName");
sb.BeginBackup();
上面的代码将启动一个异步进程来备份数据库。您可以使用 Running
属性来检查是否完成。您的线程还可以订阅三个事件
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
变量传递Percentage
。BackupFinished
事件将在备份完成后触发。当备份遇到错误时,它也会触发。- 当
SqlConnection
接收到信息消息或发生错误时,将触发BackupMessage
事件。如果发生错误,Error
将为true
。InnerException
可能包含异常或null
。
有几个属性允许您控制 SQLBackup
类。这些属性在备份运行时是只读的。
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 Server 和目标上设置了正确的权限),或者只是文件名。如果属性设置为null
,则将根据数据库名称和备份的日期/时间自动生成文件名。Compression
属性将尝试使用 SQL 备份压缩选项。此选项仅在 2008 及更高版本中有效,并且不能在 Express 版本中使用。ConnectionString
属性将允许您更改SQLBackup
实例的连接字符串。如果此连接字符串包含数据库,它将更改Database
属性,然后将主数据库存储在连接字符串中。CopyOnly
属性将尝试使用 SQL 仅复制备份选项。此选项将备份数据库,而不会中断之前的备份,并且不会将事务日志提交到数据库中(类似于不使用仅复制的全备份)。Database
属性将更改要备份的数据库。Running
属性为true
表示线程正在运行,为false
表示线程未运行。
最后,SQLBackup
类中有两种方法。第一种方法将允许您阻塞当前线程,直到备份完成。第二种方法将允许您强制终止备份进程。
sb.BeginBackup();
// sb.Running == true
Thread.Sleep(2000); // Wait 2 seconds
sb.EndBackup(); // End the backup forcibly.
// The backup may not exit immediately, you can chose to block
// the thread until it is completed.
sb.BlockUntilFinished();
// sb.Running == false
关注点
我惊讶地发现,没有人有一个通用的好方法来确定 SQL 备份的进度。我决定为我正在进行的另一个项目编写这个类,该项目需要在执行模式比较更新之前备份 SQL 数据库。我搜索了一段时间,直到偶然发现了 Remus Rusanu 对这个 StackOverflow
线程的回复。这篇文章帮助我了解了我想要如何构建这个类。
源代码已在 Windows 7 Enterprise 64 位、Visual Studio 2010 Premium 上成功编译。该项目针对 .NET Framework 的 v2.0。版本 2.0 是我正在进行的项目的一个要求。
我发现的唯一一个问题是,有时在连续进行 SQL 备份时,SQL 连接无法正确连接。如果您查看该解决方案,您可以看到我所做的 OrderedTests
,它会连续执行 4 个备份。我已经改进了代码,直到我可以成功运行 4 个并发备份。
历史
- 1.0.3813.32246 1.0 的最终代码提交,提交项目到 CodeProject
- 1.0.3814.14372 修复了
optionsString
中的错误,感谢 rmorgex