我使用下面提到的查询来确定过去 30 分钟内是否发生了任何故障转移
create table #errormsg(duration datetime,errornum int,dbmessage varchar(max))
DECLARE @tags3 VARCHAR(5000)SET @tags3 = (SELECT CAST( t.target_data AS XML ).value('(EventFileTarget/File/@name)[1]', 'VARCHAR(MAX)') FROM sys.dm_xe_sessions s INNER JOIN sys.dm_xe_session_targets t ON s.address = t.event_session_address WHERE t.target_name = 'event_file' and s.name='AlwaysOn_health');
IF @tags3 is Not NULL begin WITH cte_HADR AS (SELECT object_name, CONVERT(XML, event_data) AS data FROM sys.fn_xe_file_target_read_file(@tags3, null, null, null)WHERE object_name = 'error_reported')
insert into #errormsg 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 select distinct GETDATE() as currenttime, er.duration,dbs.name from #errormsg er inner join sys.databases dbs on er.dbmessage LIKE '%"' +dbs.name+'"%' where er.duration>=(DATEADD(mi,-30,GETDATE()) );
drop table #errormsg;end
else IF OBJECT_ID(N'TempDB.dbo.#errormsg', N'U') IS NOT NULL drop table #errormsg;
但是由于“扩展事件中的事件时间戳不正确”,我没有得到我期望的结果。
在 SSMS --> 管理--> 扩展事件--> 会话--> AlwaysOn_health--> 单击事件文件。
在那个事件文件中,
I checked recently role changed time for 'availablity_replica_state_change'.
在 MSSQL 日志文件夹中 --> "AlwaysOn_health" 文件中的可用性_replica_state_change 时间
(1) 和 (2) 中的时间戳必须相同。
但对我来说,它的展示时间不同。所以我没有得到正确的结果。
是否有任何查询可以读取 MS SQL 错误日志,而不是使用扩展事件?
是否有任何查询可查明过去 30 分钟内是否发生了故障转移?
请帮我找到解决方案。