写在前面:
第一,如果有经费,最好是使用专业的备份软件。Windows server backup (WSB) 有诸多限制和功能缺陷,只适合在没有经费或者紧急情况下的替代方案。

 第二, 本文的宗旨是解惑和最佳实践推荐。如果要看向导性质的初级文章,请点这里 和 这里 。

Okay, 开始讲故事了。

 话说有一天,technet的微博上登了一则关于使用Windows 备份Exchange数据库的帖子,我觉得不完全正确,就点了一下,结果引得一个管理员跟我争论这个问题,最后还对我开启了嘲讽模式 唉,无奈啊。。。 鉴于我们这里也有蛮多版友对如何使用Windows Server backup产生了迷惑,而且网上的文章,包括technet 文章基本都是泛泛而谈,容易让人产生误解,我这里特撰文一篇来把来龙去脉讲清楚。

 先谈几个知识要点:

要点一: 
Windows Server backup 由于使用的是 VSS备份,因此是对数据库所在的Volume进行备份,而不是针对单独的数据库文件。也就是说,如果在同一个Volume上有三个数据库,你必须对这三个数据库同时进行备份,而不能分开进行。

要点二:
 请一定把针对系统状态的备份和Exchange数据库的备份分开到不同的备份计划里。原因有二,WSB对system state进行备份时,需要特定的VSS Writer, 而且备份存储空间不可以设置为远程共享目录。

要点三:
只能针对本机的volume 进行备份,且不能使用磁带机做为存储目标。备份的数据允许被存储到远程共享,而且允许复制到其他节点进行数据库恢复。

要点四:
 缺省情况下, Windows native backup 使用Exchange Replica 的VSS Writer来备份Exchange数据库。这在单台情况下没什么问题。然而,如果针对DAG进行备份就会有问题。备份虽然能结束,但是最后会报警,同时你会在事件日志中看到警告ID: 2137 ,并且发现 transaction log 根本没有被清除。



 出现这个错误的原因是,当你使用Exchange Replica 的VSS Writer来备份Exchange数据库,你指定的那个Volume 上,必须只能有 active copy 的数据库。
 举例说明,有一个DAG如下表所示:




也就是说,例如你在DAG节点1上指定备份一个Volume1,这个Volume上有三个数据库,db1,db2,db3。现在 db1 在节点1是活跃拷贝,db2和db3是passive copy,备份结果就会报警,并且db1,2,3都不会自动清除 transaction log。要解决这个问题有两个方法:
1.        在备份任务里,选择要备份的Volume的时候,选择只有数据库的active copy 的Volume。这个方法其实很不现实,因为DAG切来切去是很正常的事情,你不能保证这个Volume上跑的总是 active copy.
 2.        使用一个注册表,启用Exchange Store 的VSS Writer来替代原始的 VSS writer. 微软technet上提供的方案就是这个。看上去很美,不是吗?但其实问题多多。这就是要点四要讲的事情了。

要点五: 
按照微软 technet的推荐,你可以创建下面的注册表并重启 Exchange replication 服务,来启用Exchange Store 的VSS Writer. 
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\V14\Replay\Parameters.
 Type: DWORD
 name: EnableVSSWriter
 value: 0
开启了这个注册表以后,你就可以解决上面的出错信息了,Windows backup可以针对同时有 passive copy 和active copy的 Volume进行备份了。

 这就全搞定了吗?其实不然,这依旧还是有问题的。technet和网上的文章都没有讲清楚,很容易让人产生误解。

 让我们回到上面的例子,对Volume1完整备份之后,你会发现db1 (该节点上的database active copy) 的transaction log 的确被自动清除了,而且清除能复制到其他的节点上。然而db2和db3的log 依然不会被自动清除。也就是说,active copy的备份的确是成功了,passive copy的备份最后被忽略了。因此,如果要成功备份全部db1 , db2, db3, 你需要去三个节点上,分别针对volume1跑一个备份任务。如此才能保证三个数据库无论被切换到哪个节点,都能被成功备份并且清除transaction log。看到这里,相信各位应该很容易看出问题了。这么将会
1.        浪费系统资源包括IO和备份存储空间
2.        浪费宝贵的备份窗口时间,要知道,Windows backup 只能同时运行一个任务,如果你有多个volume 要备份,只能一个接一个的做。
3.        针对active copy备份会产生大量的IO, 容易对客户端的使用产生影响,比如 outlook 慢,界面僵住不动等等。有人要说了,我放晚上备份不就是了吗?拜托,这已经不是exchange 2003时代了,现在的数据库动辄就是500GB朝上,而且WSB是单个进程工作的,job 要一个一个滴完成,一个晚上有多少时间留给备份的?
4.        即使你能保证每个volume 分配一个数据库,但是由于DAG的特性,你不能保证这个volume上的数据库拷贝总是 active copy. 一旦后台数据库发生切换,备份照常进行,但却是无效备份, transaction log 不会被自动删除。如果数据库数目比较多,这将是系统管理者的噩梦。

要点六:
使用的windows backup 备份的数据库,只能用来恢复 active copy. 比如,你在节点一上备份了数据库后,数据库切换到节点二了。这时候,如果你尝试用备份在节点一上直接恢复这个数据库,将会失败。你必须把数据库的 active copy切换到节点一,才可以正常恢复数据。当然你也可以拷贝数据去节点二,在节点二上恢复。



 弄清楚了以上几个要点,我们现在来一起总结一下Windows backup备份Exchange数据库的最佳实践。

1. 首先,在存储允许的情况下,尽量保证一个数据库一个 volume(注意: volume和LUN不是一个概念). 不要担心盘符不够的问题,你可以使用 mount point 来解决。


2.        备份active copy 会产生大量的IO, 容易对客户端的使用产生影响,比如 outlook 慢,界面hung住等等。因此在老的Exchange 2003系统里,管理员不得不把备份窗口限制在晚上很短的一段时间内。现在有了Exchange DAG, 我们可以针对 passive node 进行备份,从而规避备份IO带来的问题。这一点在虚拟化的Exchange private cloud系统中尤其重要。另外,如果我们能够把 passive copy 都集中到一台专门用来备份的服务器上,同时配置服务器以阻止数据自动切换到这个节点。这将能大大节省备份所需的存储空间和提高备份的效率,管理起来也方便了许多。
PowerShell 命令:
Set-MailboxServer -Identity  -DatabaseCopyAutoActivationPolicy Blocked

 3.        两步备份 (2 stage backup)。我们可以安排一台性能较低的服务器,后台除了链接数据库所需的 SAN/DAS/JBOD外,还链接大容量的 SATA盘组作为 第一步的disk to disk 的备份,然后再从备份硬盘组上把数据通过磁带机备份去VTL/TL.

 4.        为了确保每天备份的目标一定是passive copy, 备份不会因为某些人为切换而失败,我们可以在备份任务开始前大约15分钟,运行一个PowerShell脚本,检查数据库的active copy 是否都在我们预设的节点上,如果不是,把他们按照预设的优先级切换回去。

  1. cd $exscripts

  2. RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False

复制代码
5.        不要使用Windows Server backup 界面来配置备份任务,因为这样你只能配置一个任务,相当不方便。推荐使用计划任务加wbadmin命令行的方式。
  1. wbadmin start backup -backupTarget:F: -include:D:,E:,F: -allCritical -vssfull -quiet

复制代码
NOTE: 如果是mount point或者想避免使用盘符,你可以用 Volume ID 代替盘符。这个信息可以使用 mountVol.exe 从服务器上获取。类似格式如下:
  1. wbadmin start backup -backupTarget:\\remoteshare\Exchangebackup\node1 -include:\\?\Volume{1be73a5a-052f-11df-82c2-806e6f6e6963}\,\\?\Volume{26934b04-09f5-11df-a2b7-002564f8c664}\,\\?\Volume{26934b0b-09f5-11df-a2b7-002564f8c664}\,\\?\Volume{26934b0e-09f5-11df-a2b7-002564f8c664}\,\\?\Volume{1be73a5b-052f-11df-82c2-806e6f6e6963}\ -allCritical -vssfull -quiet

复制代码
6.        网上还有一些文章推荐在每晚备份前把数据库用脚本切换到一个节点,然后在这个节点上统一备份,完成之后再切回各自节点的方法。这个方法实用性很差而且风险很大。首先,你怎么确保数据库切换一定成功?怎么保证切过去了能切回来?万一备份时间太长,没结束就要往回切了呢?这不乱套了吗?另外,切换的时候某些版本的Outlook 可能会弹框或者产生延迟。


 综上所述,我们可以得到如下两个最优化方案。


 方案一:当你手头没有足够的存储和服务器的时候。



1.        开启注册表来启用Exchange Store 的VSS Writer
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\V14\Replay\Parameters.
 Type: DWORD
 name:  EnableVSSWriter
 value: 0

重启 Microsoft exchange replication service

 2.        配置一个计划任务,在所有备份任务开始前15分钟运行。
Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
 Switch:
 -NonInteractive -WindowStyle Hidden -command "&'C:\source\balancedb.ps1' -MonitoringContext -ShowDetailedErrors-ErrorAction:Continue"
 (注意上面的路径可能变化)

脚本balancedb.ps1内容如下
  1. cd $exscripts

  2. RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False

复制代码
3.        为了尽量避免备份带来的IO影响,尽量把备份窗口安排在晚上。

4.        尽量确保每volume一数据库,然后配置windows backup只备份预设的active copy 所在的那个 volume.

 5.        使用命令行来配置多个备份任务。记得控制好时间间隔,Windows Server Backup 对Exchange备份,同时只支持一个备份任务,不要一个没结束另外一个就开始了,这样后面那个任务就会被自动忽略。



 方案二:如果你有足够的服务器和存储,推荐下面这个方案



1.        尽量确保每volume一数据库。
2.        配置一台备份专用的低配置服务器加入到DAG中,配置这台服务器上只跑 passive copy 
 3.        同时配置服务器以阻止数据自动切换到这个节点。这将能大大节省备份所需的存储空间和提高备份的效率,管理起来也方便了许多。
PowerShell 命令:
  1. Set-MailboxServer -Identity  -DatabaseCopyAutoActivationPolicy Blocked

复制代码
4.        配置一个计划任务,在所有备份任务开始前15分钟,运行。
Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
 Switch:
 -NonInteractive -WindowStyle Hidden -command "&'C:\source\balancedb.ps1' -MonitoringContext -ShowDetailedErrors-ErrorAction:Continue"
 (注意上面的路径可能变化)

脚本balancedb.ps1内容如下
  1. cd $exscripts

  2. RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False

复制代码
5.        由于是在passive copy 上备份,生产环境不会受到备份IO的影响,因此可以把备份窗口延长到较长的时间段,甚至是白天的时段。
6.        使用命令行来配置多个备份任务。记得控制好时间间隔,Windows Server Backup 对Exchange备份,同时只支持一个备份任务,不要一个没结束另外一个就开始了,这样后面那个任务就会被自动忽略。

 讲了这么多,就是为了抛砖引玉,欢迎大家讨论,觉得有什么不对或者还可以改善的地方,尽管指出,加分加点。