通过测试SQL Server数据库数据和日志驱动器增强AlwaysOn故障转移策略


译者注:

该脚本适合在SQL Server 2012\2014中配置为自动故障转移的副本中部署。


前言

在SQL Server 2012和2014,在自动故障转移模式的AlwaysOn可用性组不会在数据库级别错误触发故障转移。例如:如果用户数据库的数据或日志文件失败,或者用户数据库损坏并导致状态从在线变为其他状态(如置疑),数据库群集不会自动故障转移可用性组。

在SQL Server 2016,我们在创建和修改可用性组命令的部分添加了一个额外的配置设置叫做DB_FAILOVER,如果在主副本的一个数据处于非在线状态将触发故障转移。意思是,如果AG配置为自动故障转移,并且处于同步状态的数据库遇到失败,数据库级别的错误将会触发自动故障转移。

添加这个脚本的方法,使你你可以再遇到磁盘故障时让群集执行自动故障转移。该VB脚本在脚本中指定的路径执行文件写入。如果写入失败,意味着磁盘失败并且脚本失败。失败的脚本导致群集中的脚本资源失败。如果在脚本资源上的依赖恰当配置,这将导致由于磁盘/VB脚本失败的群集触发故障转移。

因为这个脚本不需要连接或以任何方式利用SQL Server,你可以针对SQL Server 2012\2014\2016部署。但在2016中的收益不如配置启用参数DB_FAILOVER,因为一个数据库级别的失败导致自动故障转移。


翻译自:

https://blogs.msdn.microsoft.com/alwaysonpro/2016/01/14/enhance-alwayson-failover-policy-to-test-sql-server-database-data-and-log-drives/


在SQL Server 2012和2014,AlwaysOn健康诊断以多种方式检测SQL Server进程的健康。然而,没有在AlwaysOn可用性组上的数据库的可访问性或存活性的健康检测。如果承载可用性组数据库或日志文件的磁盘丢失,AlwaysOn健康诊断不会检测该事件,并且应用程序运行时错误访问数据库失败。丢失驱动器或访问承载可用性数据库数据和日志文件的驱动器错误,会影响访问你的生产数据的访问。

正如可用性组的自动故障转移的弹性故障转移策略所描述:

“损坏的数据库和置疑的数据库不会在任何失败条件级别上检测。因此,一个数据库损坏或置疑(是否由于硬件失败、数据故障或其他问题)绝不会触发自动故障转移。”

注意:SQL Server 2016增强数据库健康检测的AlwaysOn健康诊断。如果你的AlwaysOn可用性组开启数据库健康检测,并且数据库状态转化为非ONLINE状态(sys.databases.state_desc),整个可用性组将自动故障转移。可参考MSDN关于“CREATE AVAILABILITY GROUP”的“DB_FAILOVER”部分。

你可以通过检测磁盘健康来增强数据库的可用性。添加一个普通的脚本资源到你的可用性组资源组,做基本的针对承载可用性组数据库数据和日志文件的驱动器的读或写测试。以下描述如何添加一个普通脚本资源作为一个可用性组资源的依赖,通过甲苯的磁盘健康检查来增强AlwaysOn健康检测。


使用一个普通脚本资源来做基本的SQL Server数据和日志驱动器健康检查

这是一个高级别的描述关于部署普通的脚本资源来检测可用性组数据库驱动器健康。

添加一个普通的脚本集群资源到可用性组资源组。让可用性组资源依赖于普通资源脚本。这样,如果脚本资源报告IsAlive失败,Windows群集会尝试重启或者故障转移可用性组资源。

普通脚本集群资源IsAlive测试在特定的数据驱动器位置创建一个文本文件、在特定的日志驱动器位置创建一个文本文件。如果文件存在,脚本将会覆盖它。

该脚本打包为GenericScript_SQLIsAlive.zip,包括:

Sqlisalive.vbs

这个普通的脚本用Visual Basic脚本编写,并部署Windows群集IsAlive。

Add_SQLIsAliveScript.ps1

这个PowerShell脚本添加普通脚本资源到你的可用性组资源组,并设置可用组依赖于你的普通脚本资源。

Readme.txt

部署普通脚本资源的按步骤的指南,和如何测试脚本的额外指南。


部署普通脚本资源

I. 配置普通脚本sqlisalive.vbs。

数据和日志驱动器路径:

当前,普通脚本配置为测试一下驱动器和路径:c:\temp\data和c:\temp\log。对于测试目的,在每个副本的本地驱动器上创建这些路径(主副本和自动故障转移伙伴辅助副本)。之后,你可以修改它们为适当的你的数据库数据和日志文件位于的驱动器和路径。

DataDriveFile=”c:\temp\data\ScriptFileData.txt”
LogDriveFile=”c:\temp\log\ScriptFileLog.txt”


II. 配置和执行PowerShell脚本来部署普通脚本到你的可用性组。

注意:这个普通脚本只部署每60秒运行的IsAlive。

1. 确保你的可用性组有两个副本配置为自动故障转移。

2. 拷贝普通脚本文件到相同的本地存储路径,像配置为自动故障转移的副本的所有服务器的“C:\temp\sqlisalive.vbs”。

3. 创建用于健康检查的路径,C:\temp\data和C:\temp\log。

4. Add_SQLIsAliveScript.ps1脚本添加普通脚本资源到你的可用性组,并在普通脚本资源上添加一个依赖到你的可用性组资源。在Add_SQLIsAliveScript.ps1,修改如下变量:

设置$ag为你的可用性组名称。

设置$listener为你的可用性组监听器名称。如果你的可用性组没有监听器,设置$listener为””。

设置$scriptfilepath为你的sqlisalive.vbs脚本的路径和文件名。

5. 在承载主副本的服务器上,运行PowerShell脚本Add_SQLIsAliveScript.ps1去添加普通脚本资源到你的可用性组资源组。

clip_image002

6. 打开故障转移群集管理器,并检查可用性组资源组来确认添加了普通脚本资源到可用性组资源组。普通脚本应该出现在资源页面,并在可用性组资源组为在线状态。

clip_image004

7. 确认可用性组资源中在普通脚本资源上创建了依赖。

clip_image006

注意:

额外的readme.txt包含如何测试脚本资源来确认它可以故障转移到你的可用性组资源的指南。


通过普通脚本资源诊断失败检测

对承载主副本的节点生成群集日志,并搜索“Data Drive Create File”或“Log Drive Create File”,以定位普通脚本资源IsAlive成功或失败的报告:

00001b04.00002924::2015/12/07-17:16:41.798 INFO  [RES] Generic Script <sqlisalive>: Entering IsAlive
00001b04.00002924::2015/12/07-17:16:41.801 INFO  [RES] Generic Script <sqlisalive>: Data Drive Create File Succeeded
00001b04.00002924::2015/12/07-17:16:41.801 INFO  [RES] Generic Script <sqlisalive>: Log Drive Create File Succeeded

或者例如,你设置\Data目录为只读:

00001b04.00002924::2015/12/07-17:17:41.801 INFO  [RES] Generic Script <sqlisalive>: Entering IsAlive
00001b04.00002924::2015/12/07-17:17:41.804 INFO  [RES] Generic Script <sqlisalive>: Data Drive Create File Succeeded
00001b04.00002924::2015/12/07-17:17:41.804 INFO  [RES] Generic Script <sqlisalive>: Data Drive Create File Failed
00001b04.00002924::2015/12/07-17:17:41.804 INFO  [RES] Generic Script <sqlisalive>: Permission denied
00001b04.00002924::2015/12/07-17:17:41.804 ERR   [RES] Generic Script <sqlisalive>: 'IsAlive' script entry point returned FALSE.'
00001b04.00002924::2015/12/07-17:17:41.804 INFO  [RES] Generic Script <sqlisalive>: Return value of 'IsAlive' script entry point caused HRESULT to be set to 0x00000001.
00001b04.00002298::2015/12/07-17:17:41.804 WARN  [RHS] Resource sqlisalive IsAlive has indicated failure.