SQLSERVER 2012 HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING 等待事件

来源:互联网 发布:网络传输介质各自特点 编辑:程序博客网 时间:2024/06/05 05:23

HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING

A query on object(s) in a readable secondary database of an AlwaysOn availability group is blocked on row versioning while waiting for commit or rollback of all transactions that were in-flight when the secondary replica was enabled for read workloads. This wait type guarantees that row versions are available before execution of a query under snapshot isolation.

问题描述

在AlwaysOn辅助副本上,做select查询运行缓慢,发现遇到HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING等待。

排查方法

确定遇到该等待事件的查询语句包含对象所在的数据库(假设为adventureworks2012)。
在主副本上运行如下查询语句查看堵塞的源头。

select * from sys.sysprocesses where open_tran>0 and dbid=db_id('adventureworks2012')

如上语句运行出来的所有行,即为导致辅助副本上运行语句的堵塞会话。若该会话处于异常状态,导致无法提交,您可以选择直接kill此会话

问题场景及后续跟进

1)在正常运行的AlwaysOn环境中,当一个辅助副本被意外踢出然后加入时,这些定向到辅助副本上的业务很有可能会陷入阻塞。这时可以考虑将业务暂时先放在主副本上运行,等待状态变更时运行的语句运行完即可。如果要定位这些语句您可以查看主副本上活动事务和涉及的可用性组数据库来定位。

2)在正常运行的AlwaysOn环境中,变更辅助副本的可读状态也有可能会遇到如上等待事件。因此,在变更状态前应该有一个充分的准备。

等待事件详细复现条件

1.主副本上一直有关于可用性组数据库的活动事务。
2.满足条件1下,辅助副本被踢出然后再加入或者是辅助副本的可读性状态从No变成Yes。

场景再现

1)环境架构:
这里写图片描述

2)等待事件重现:
条件1必须要满足.
条件2有两种情况.
因此,该等待事件有两大种情况如下。

情况1.复现辅助副本被踢出然后加入
Step1.在主副本tux12-node1上的实例运行一个事务。

begin tran update person.person set title='Mr.' where BusinessEntityID=1

Step2.在群集管理器中将tux12-node2从failover cluster中踢出。
这里写图片描述

Step3.在群集管理器中将tux12-node2从filover cluster中加入。
Step4.在tux12-node2的辅助副本上的一个会话中运行如下查询会陷入等待。该表只是adventureworks2012下的一个任意表。如下会话为51:

use adventureworks2012select * from person.personphone

Step5.在tux12-node2的辅助副本上的另一个会话中运行如下查询。此时可以看到会话51上有目标等待事件。

select * from sys.sysprocesses where status = 'suspended'

这里写图片描述

情况2.复现辅助副本可读性状态从No变Yes

Step1.将辅助副本tux12-node3的可读性状态确认为No。右击AlwaysOn架构图中的可用性组‘node1-2-3-ag’ -> ‘属性’ -> ‘General’ -> 右边对话框处如下:
这里写图片描述
Step2.在主副本tux12-node1上的实例运行一个事务。

begin tran update person.person set title='Mr.' where BusinessEntityID=1

Step3.将辅助副本tux12-node3的可读性状态变为Yes。
这里写图片描述
Step4.在tux12-node3的辅助副本上的一个会话中运行如下查询会陷入等待。该表只是adventureworks2012下的一个任意表。如下会话为53:

use adventureworks2012select * from HumanResources.Department

Step5.在tux12-node3的辅助副本上的另一个会话中运行如下查询。此时可以看到会话53上有目标等待事件。
这里写图片描述

原创粉丝点击