SQL Server 2012提供了非常多的信息来方便你监视可用性组的运行状态。
系统视图和动态管理视图
首先,AlwaysOn提供了大量的系统视图和动态管理视图,可以通过视图来监视以下对象的状态:
(1) 可用性组所在的Windows故障转移群集
· sys.dm_hadr_cluster
· sys.dm_hadr_cluster_members
· sys.dm_hadr_cluster_networks
· sys.dm_hadr_instance_node_map
· sys.dm_hadr_name_id_map
(2) 可用性组
· sys.availability_groups
· sys.availability_groups_cluster
· sys.dm_hadr_availability_group_states
(3) 可用性副本
· sys.availability_replicas
· sys.availability_read_only_routing_lists
· sys.dm_hadr_availability_replica_cluster_nodes
· sys.dm_hadr_availability_replica_cluster_states
· sys.dm_hadr_availability_replica_states
· sys.fn_hadr_backup_is_preferred_replica
(4) 可用性数据库
· sys.availability_databases_cluster
· sys.databases (添加了replica_id,group_database_id列来兼容AlwaysOn)
· sys.dm_hadr_auto_page_repair
· sys.dm_hadr_database_replica_states
· sys.dm_hadr_database_replica_cluster_states
(5) 可用性组的Listener
· sys.availability_group_listener_ip_addresses
· sys.availability_group_listeners
· sys.dm_tcp_listener_states
由于篇幅的限制,这里无法对每个视图都详细的介绍。要获取更详细的信息,你可以参考SQLServer的联机丛书。
性能计数器
AlwaysOn引入了两个性能监视器的对象:SQLServer:AvailabilityReplica和SQLServer:Database Replica。每个对象下面都有一些性能计数器用来让你了解当前可用性组运行的健康状况和性能表现。
SQLServer:AvailabilityReplica:当你在性能监视器中选中某个AvailabilityReplica对象的计数器后,计数器实例名会显示为<AG Name:Instance Name of the replica>。假设你要监视的是可用性组ag的可用性副本AlwaysOn1,那么计数器实例就是ag:AlwaysOn1。
SQLServer:DatabaseReplica:当在性能监视器中选中某个Database Replica对象的计数器后,每个参数副本的数据库都成为一个计数器实例。假设可用性组ag拥有可用性副本AlwaysOn1,且ag包含3个可用性数据库agdb1,agdb2和agdb3。一旦你选中了SQLServer:DatabaseReplica下的某个技术器后,你就可以看到分别代表agdb1,agdb2和agdb3三个的计数器实例。你可以决定选择某个数据库或者所有数据库进行监视。
Database Replica and Availability Replica 下的计数器所包含的信息,有的是对主副本和辅助副本都有意义的,而有的可能只对某种角色的副本有意义。举例来说,Database Replica:Log Send Queue 计数器是用来标示主副本上还有多少没被送到辅助副本上的日志块的。你只有在辅助副本上观察这个计数器才有意义,因为不同的辅助副本未收到的日志块数量可能是不同的。
下面这个表格列举了每种计数器应当在哪种角色的副本上进行监视。
Counter | Primary | Secondary |
Availability Replica: Sends to Replica / Sec | X | X |
Availability Replica: Receives from Replica / Sec | X | X |
Availability Replica: Bytes Sent to Replica / Sec | X | X |
Availability Replica: Bytes Received from Replica / sec | X | X |
Availability Replica: Sends to Transport / sec | X | X |
Availability Replica: Bytes Sent to Transport / sec | X | X |
Availability Replica: Resent Messages / sec | X | X |
Availability Replica: Flow Control Time | X | |
Availability Replica: Flow Control / sec | X | |
Database Replica: Redo Bytes Remaining | X | |
Database Replica: Log Bytes Received / sec | X | |
Database Replica: File Bytes Received / sec | X | |
Database Replica: Log Remaining to Undo | X | |
Database Replica: Total Log Requiring Undo | X | |
Database Replica: Redone Bytes / sec | X | |
Database Replica: Recovery Queue | X | |
Database Replica: Log Send Queue | X | |
Database Replica: Transaction Delay | X | |
Database Replica: Mirrored Write Transactions / sec | X |
表3-2不同角色的可用性副本可使用的AlwaysOn性能计数器
DashBoard
一旦你创建了一个可用性组,你就可以使用AlwaysOn的DashBoard。DashBoard用来监视可用性组,副本和数据库的健康状况。DashBoard是一个将各种信息集中在一体的报表,它不但本身包含丰富的信息,而且通过它你还能转向到其他的日志(AlwaysOn_health事件,SQL错误日志,Windows 群集日志以及Windows事件日志等),以获得更进一步的分析信息。
要打开Dashboard,你只需要在SQLServer Management Studio中选中所想要监视的可用性组,然后点击右键选择“ShowDashboard”.
在Dashboard报表中,可用性组的健康状况是基于AlwaysOn的系统策略(SystemPolicy)评估出来的。可用性组、可用性副本和数据库都会显示其各自的健康状态。在下面的图中,可用性组,可用性副本和数据库的状态都是“健康”。
你可以通过SQLServer Management Studio找到所有AlwaysOn的系统策略以及每个策略所对应的系统条件。
Dashboard中其余的信息都来自于AlwaysOn的动态管理视图。你可以对DashBoard进行客制化,在可用性副本和数据库级别添加你想要的其他信息。例如,你可以在Dashboard中的可用性组列表的列名处点击右键,这样你就能看到所有可以加入到该列表中的额外数据列。这些可额外添加的数据列大部分都能直接对应到动态管理视图中相应的列上。
AlwaysOn_health 会话
AlwaysOn_health会话是SQL Server 2012自带的扩展事件对话。当你通过SQL ServerManagement Studio中的向导创建可用性组之后,这个会话会被启动。如果你使用的是T-SQL或者Powershell脚本创建可用行组的话,那么该会话不会启动。
AlwaysOn_Health会话会在SQL Server的LOG目录下生成一系列名为“AlwaysOn_health_<序号>_<创建时间>.xel”的扩展事件日志文件。该事件日志文件会记录一些重要的事件,例如可用性副本/数据库的状态变化,Failover条件的改变,副本间同步状况变化等等。它还会记录AlwaysOn自身发生的错误,以及任何可能会影响可用性组健康状况的操作系统问题或SQLServer数据库引擎问题。
另一个SQLServer 2012自带的扩展事件对话是System_Health。该对话会在SQLServer的LOG目录下生成一系列名为“system_health_<序号>_<创建时间>.xel”的扩展事件日志文件。System_Health扩展事件日志和AlwaysOn无关,它的作用类似于SQL Server的默认Trace。SQL Server一旦启动,该扩展事件日志文件就会开始自动捕获它所关心的信息。该日志收集的数据也能帮助你对数据库引擎的性能问题进行故障排除。自动捕捉的信息包括:
· 发生严重性 >=20 的错误的任何会话的 sql_text 和 session_id。
· 发生与内存有关的错误的任何会话的 sql_text 和 session_id。 这些错误包括 17803、701、802、8645、8651、8657 和 8902。
· 任何无法完成的计划程序问题的记录。 (这些问题在 SQL Server 错误日志中显示为错误 17883。)
· 检测到的任何死锁。
· 等待闩锁(或其他相关资源)的时间 > 15 秒的任何会话的 callstack、sql_text 和session_id 。
· 等待锁的时间 > 30 秒的任何会话的 callstack、sql_text 和session_id 。
· 已长时间等待以获得抢先等待的任何会话的 callstack、sql_text 和session_id。 持续时间因等待类型而异。 在抢先等待中,SQL Server 等待的是外部 API 调用。
SQLDIAG扩展事件日志
前面我们已经讲过SQLServer 2012故障转移群集使用sp_server_diagnostics来获取诊断信息,并且会把sp_server_diagnostics返回的信息也会被记录到SQLDIAG扩展事件日志文件中。详细信息参见2.1.6章节。
sp_server_diagnostics也负责AlwaysOn可用性组的健康状况检查。同样的,sp_server_diagnostics返回的信息依旧会被记录到SQLDIAG日志里。我们也可以通过检查SQLDIAG文件中记录的信息来对可用性发生的异常状况进行排查。例如,我们可以通过SQLDIAG中记录的SQLServer实例的资源使用情况来判断是否是由于资源瓶颈导致了可用性发生了故障切换。
SQL Server 2012 Management Studio能够直接打开后缀为.xel的扩展事件日志文件,打开日志之后,你不但能够浏览事件信息,而能对它们进行聚合、分组、过滤等操作。
图3-32在SQLServer Management Studio中打开SQLDIAG扩展事件日志