web-dev-qa-db-ja.com

可用性グループで最後のフェールオーバー時間を決定する方法

AGグループがフェールオーバーしたときにクエリを実行する方法があるかどうかを知りたいだけです。

例-これは現在プライマリレプリカですが、昨日はセカンダリだったと思いますか?フェイルオーバーがいつ発生したかを知る方法

私が探しているログに特定のものはありますか、または使用するtsqlスクリプトはありますか?

4
Trubs

次のPowerShellスクリプトを使用して、最後のフェイルオーバー時間を取得できます

    Get-winEvent -ComputerName ListnerName -filterHashTable @{logname ='Microsoft-Windows-FailoverClustering/Operational'; id=1641}| ft -AutoSize -Wrap 
8
mashrur

監視スクリプト(またはサードパーティのSQL監視ソリューション)を設定して、sys.dm_hadr_availability_replica_statesDMVのさまざまな列を定期的にクエリすることができます(30秒ごとなど)、値を収集したときのタイムスタンプを付けます。

フェイルオーバーイベントに関連する特定の列は次のとおりです。

  • last_connect_error_number
  • last_connect_error_description
  • last_connect_error_timestamp

追跡する価値のある追加の列:

  • 役割
  • 運用状態
  • connected_state

上記の列の詳細な説明:

sys.dm_hadr_availability_replica_states(Transact-SQL)

AlwaysOn可用性グループのすべてのDMVの概要と詳細へのリンクは、MSDNで入手できます。

監視可用性グループ(Transact-SQL)

4

最後のフェイルオーバーがいつ発生したかを見つけることは困難ですが、フェイルオーバーが発生したときに通知(アラート)を受け取ることができます...(メールを検索できますか?)

エラー番号1480を使用して、フェイルオーバーが発生したことをユーザー(またはチーム)に通知するアラートを作成できます

1]

注:これにより、AG内のすべてのデータベース(各サーバー上)に電子メールが送信されます。私の場合、2つのサーバー上の12のデータベースでした。 [オプション]タブで、Delay between responses:を1分程度に設定して、1分間に1通のメールだけが送信されるようにすることができます。

3
Trubs

以下は、要求に応じて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
3
DonB

フェイルオーバーが成功した場合、Windowsイベントログにはエントリが含まれます。

可用性グループ ''のローカル可用性レプリカの状態が「RESOLVING_NORMAL」から「PRIMARY_PENDING」に変更されました

可用性グループ ''のローカル可用性レプリカの状態が「PRIMARY_PENDING」から「PRIMARY_NORMAL」に変更されました

この MS KB記事 にはエラーメッセージの詳細が記載されており、 PowerShellスクリプト を使用して、特定のイベントに基づいて電子メールを送信できます。

Windowsのイベントログとは別に、 Cluster Diagnostic Extended Event Log を次のような形式で確認できます-ServerName_InstanceName_SQLDIAG_*.xel

2
Kin Shah
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;
0