AGグループがフェールオーバーしたときにクエリを実行する方法があるかどうかを知りたいだけです。
例-これは現在プライマリレプリカですが、昨日はセカンダリだったと思いますか?フェイルオーバーがいつ発生したかを知る方法
私が探しているログに特定のものはありますか、または使用するtsqlスクリプトはありますか?
次のPowerShellスクリプトを使用して、最後のフェイルオーバー時間を取得できます
Get-winEvent -ComputerName ListnerName -filterHashTable @{logname ='Microsoft-Windows-FailoverClustering/Operational'; id=1641}| ft -AutoSize -Wrap
監視スクリプト(またはサードパーティのSQL監視ソリューション)を設定して、sys.dm_hadr_availability_replica_statesDMVのさまざまな列を定期的にクエリすることができます(30秒ごとなど)、値を収集したときのタイムスタンプを付けます。
フェイルオーバーイベントに関連する特定の列は次のとおりです。
追跡する価値のある追加の列:
上記の列の詳細な説明:
sys.dm_hadr_availability_replica_states(Transact-SQL)
AlwaysOn可用性グループのすべてのDMVの概要と詳細へのリンクは、MSDNで入手できます。
最後のフェイルオーバーがいつ発生したかを見つけることは困難ですが、フェイルオーバーが発生したときに通知(アラート)を受け取ることができます...(メールを検索できますか?)
エラー番号1480を使用して、フェイルオーバーが発生したことをユーザー(またはチーム)に通知するアラートを作成できます
注:これにより、AG内のすべてのデータベース(各サーバー上)に電子メールが送信されます。私の場合、2つのサーバー上の12のデータベースでした。 [オプション]タブで、Delay between responses:
を1分程度に設定して、1分間に1通のメールだけが送信されるようにすることができます。
以下は、要求に応じて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
フェイルオーバーが成功した場合、Windowsイベントログにはエントリが含まれます。
可用性グループ ''のローカル可用性レプリカの状態が「RESOLVING_NORMAL」から「PRIMARY_PENDING」に変更されました
可用性グループ ''のローカル可用性レプリカの状態が「PRIMARY_PENDING」から「PRIMARY_NORMAL」に変更されました
この MS KB記事 にはエラーメッセージの詳細が記載されており、 PowerShellスクリプト を使用して、特定のイベントに基づいて電子メールを送信できます。
Windowsのイベントログとは別に、 Cluster Diagnostic Extended Event Log を次のような形式で確認できます-ServerName_InstanceName_SQLDIAG_*.xel
SELECT @FileName = target_data.value('(EventFileTarget/File/@name)[1]','nvarchar(4000)')
FROM (
SELECT
CAST(target_data AS XML) target_data
FROM sys.dm_xe_sessions s
JOIN sys.dm_xe_session_targets t
ON s.address = t.event_session_address
WHERE s.name = N'AlwaysOn_health'
) ft
SELECT
XEData.value('(event/@timestamp)[1]','datetime2(3)') AS event_timestamp,
XEData.value('(event/data[@name="previous_state"]/text)[1]', 'varchar(255)') AS previous_state,
XEData.value('(event/data[@name="current_state"]/text)[1]', 'varchar(255)') AS current_state,
XEData.value('(event/data[@name="availability_replica_name"]/value)[1]', 'varchar(255)') AS availability_replica_name,
XEData.value('(event/data[@name="availability_group_name"]/value)[1]', 'varchar(255)') AS availability_group_name
INTO #Temp FROM (
SELECT CAST(event_data AS XML) XEData, *
FROM sys.fn_xe_file_target_read_file(@FileName, NULL, NULL, NULL)
WHERE object_name = 'availability_replica_state_change'
) event_data
WHERE XEData.value('(event/data[@name="current_state"]/text)[1]', 'varchar(255)') = 'PRIMARY_NORMAL'
ORDER BY event_timestamp DESC;