写在前面:
第一,如果有经费,最好是使用专业的备份软件。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 <server name> -DatabaseCopyAutoActivationPolicy Blocked
3. 两步备份 (2 stage backup)。我们可以安排一台性能较低的服务器,后台除了链接数据库所需的 SAN/DAS/JBOD外,还链接大容量的 SATA盘组作为 第一步的disk to disk 的备份,然后再从备份硬盘组上把数据通过磁带机备份去VTL/TL.
4. 为了确保每天备份的目标一定是passive copy, 备份不会因为某些人为切换而失败,我们可以在备份任务开始前大约15分钟,运行一个PowerShell脚本,检查数据库的active copy 是否都在我们预设的节点上,如果不是,把他们按照预设的优先级切换回去。
cd $exscripts
RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False
wbadmin start backup -backupTarget:F: -include:D:,E:,F: -allCritical -vssfull -quiet
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
cd $exscripts
RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False
Set-MailboxServer -Identity <server name> -DatabaseCopyAutoActivationPolicy Blocked
cd $exscripts
RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False