Tru*_*ubs 5 sql-server availability-groups sql-server-2014
我只是想知道有没有什么方法可以查询AG组什么时候发生故障。
例如 - 这是现在的主要副本,但我很确定它是昨天的次要副本?我如何找到故障转移发生的时间
日志中是否有我应该查找的特定内容,或者是否有要使用的 tsql 脚本?
小智 9
您可以使用以下 PowerShell 脚本获取上次故障转移时间
Get-winEvent -ComputerName ListnerName -filterHashTable @{logname ='Microsoft-Windows-FailoverClustering/Operational'; id=1641}| ft -AutoSize -Wrap
Run Code Online (Sandbox Code Playgroud)
虽然很难找出上次故障转移发生的时间,但当故障转移确实发生时,您可以收到通知(警报)...(然后您可以搜索您的电子邮件?)
您可以使用错误号 1480 创建警报,让您(或您的团队)知道何时发生故障转移
![1]](https://i.stack.imgur.com/AkImz.png)
注意:这将为 AG 中的每个数据库(每台服务器上)发送一封电子邮件,在我的例子中是 2 台服务器上的 12 个数据库。在选项选项卡上,您可以设置Delay between responses: 为 1 分钟之类的值,这样每分钟只发送一封电子邮件。
小智 7
以下列出了运行此操作的服务器上所有故障转移事件的每个数据库的故障转移时间和方向,根据请求使用 T-SQL。
-- Script to determine failover times in Availability Group
;WITH cte_HADR AS (SELECT object_name, CONVERT(XML, event_data) AS data
FROM sys.fn_xe_file_target_read_file('AlwaysOn*.xel', null, null, null)
WHERE object_name = 'error_reported'
)
SELECT data.value('(/event/@timestamp)[1]','datetime') AS [timestamp],
data.value('(/event/data[@name=''error_number''])[1]','int') AS [error_number],
data.value('(/event/data[@name=''message''])[1]','varchar(max)') AS [message]
FROM cte_HADR
WHERE data.value('(/event/data[@name=''error_number''])[1]','int') = 1480
Run Code Online (Sandbox Code Playgroud)