65.9K
CodeProject 正在变化。 阅读更多。
Home

使用相对文件路径和进度备份 SQL Server

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (6投票s)

2010 年 6 月 11 日

CPOL

3分钟阅读

viewsIcon

46113

downloadIcon

2817

这个类将允许您异步备份数据库,同时获取进度、消息和错误通知。

引言

本文提供的类将允许您在不阻塞(即异步)的情况下执行 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 将为 trueInnerException 可能包含异常或 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
© . All rights reserved.