1

以下のクエリを使用して、過去 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;

しかし、「拡張イベントのイベントのタイムスタンプが正しくない」ため、期待した結果が得られませんでした。

  1. SSMS で --> 管理 --> 拡張イベント --> セッション --> AlwaysOn_health --> イベント ファイルをクリックします。

    そのイベントファイルでは、

     I checked recently role changed time for 'availablity_replica_state_change'. 
    
  2. MSSQL ログ フォルダー内 --> "AlwaysOn_health" ファイル内の availablity_replica_state_change 時間

(1) と (2) のタイムスタンプは同じである必要があります。

しかし、私にとっては、そのショーは別の時間です。そのため、適切な結果が得られませんでした。

拡張イベントを使用する代わりに、MS SQL エラー ログを読み取るクエリはありますか?

過去 30 分間にフェールオーバーが発生したかどうかを確認するクエリはありますか?

これの解決策を見つけるのを手伝ってください。

4

0 に答える 0