web-dev-qa-db-ja.com

sys.dm_hadr_database_replica_states、さまざまな* _time列について

sys.dm_hadr_database_replica_statesシステムテーブルのさまざまな時間列の意味を理解しようとしています。

3つのノードのAlways On可用性グループがあり、2つのノードが同期し、1つのノードが非同期です。 レポートに非同期ノードを使用し、プライマリレプリカと非同期レプリカの間の遅延を計算する正確な方法を見つけたいと考えています。

以下はクエリのスナップショットです。

select synchronization_state_desc, 
       is_primary_replica, 
       last_sent_time, 
       last_received_time, 
       last_hardened_time, 
       last_redone_time, 
       last_commit_time
from sys.dm_hadr_database_replica_states DRS 
where database_id = db_id('DBname')

enter image description here

質問を絞り込むために投稿を編集しました

データが非同期ノードに表示されるまでにかかる実際の遅延を見つける必要がある場合、どの列を使用しますか?

3
user158327

手始めに、これが Microsoft Docs Page です。

余談ですが、純粋に私の答えを理解できるように、可用性グループのメカニズムについて少し読んでおくことをお勧めします。 ( Microsoft Docsページ

質問への回答については、RDBMSに関する質問の場合と同様に、状況によって異なります。

この場合は、「...データが表示される」という意味によって異なります

質問の列を見てみましょう:

  • last_sent_time、
  • last_received_time、
  • last_hardened_time、
  • last_redone_time、
  • last_commit_time

また、参照しているシステムDMVがデータベースレベルであることにも注意してください。


last_sent_time

この時刻は、PRIMARYがログブロックを使用可能なセカンダリに最後に送信した時刻を示します。これは、データ同期プロセスの開始です。

last_received_time

これは、セカンダリが最後にログブロックを受信した時間を示します。

last_hardened_time

これは、セカンダリが受信したログブロックデータをディスクに最後にキャッシュした時間を示します。

last_redone_time

これは、最後のLSNがターゲットデータベースでやり直された時刻です。

last_commit_time

これは、最後のコミットレコードがやり直され、プライマリに報告された時間です。


まとめ

上記のうち、セカンダリシステムへのデータのさまざまなエントリポイントがあります。

データは最初にlast_received_timeでサーバーにメモリに入ります

データは最初にlast_hardened_timeにディスク上のサーバーに入ります

データは最初にlast_redone_timeにデータベースデータファイルに入ります

last_commit_timeに、データが最初にコミットされ、クエリによる読み取り(奇妙なNOLOCK状況以外)に利用できるようになります。

あなたの質問に対する答えは、4つの概念のうちの後者だと思います。 SECONDARYとPRIMARYの間のデータの送信時間のため、この列の時間にはsmallオーバーヘッドがあります。ただし、これはデータスループットの速度を決定するための計算では重要ではない可能性があります。

1
George.Palacios