エラー 9002: SQL Server のAVAILABILITY_REPLICAエラー メッセージが原因で、データベースのトランザクション ログがいっぱいです
この記事は、トランザクション ログが大きくなったり、SQL Server の領域が不足したりしたときに発生する 9002 エラーを解決するのに役立ちます。
元の製品バージョン: SQL Server 2017、SQL Server 2016、SQL Server 2014、SQL Server 2012
元の KB 番号: 2922898
現象
以下のシナリオについて考えてみます。
- Microsoft SQL Server 2012 以降のバージョンがサーバーにインストールされている。
- SQL Server のインスタンスは、Always On 可用性グループ環境のプライマリ レプリカです。
- トランザクション ログ ファイルの autogrow オプションは、SQL Server で設定されます。
このシナリオでは、トランザクション ログが大きくなり、ディスク領域が不足したり、プライマリ レプリカのトランザクション ログに設定された MaxSize オプションを超えたりして、次のようなエラー メッセージが表示されることがあります。
エラー: 9002、重大度: 17、状態: 9。 'AVAILABILITY_REPLICA' のため、データベース '%.*ls' のトランザクション ログがいっぱいです
原因
これは、プライマリ レプリカでログに記録された変更がまだセカンダリ レプリカで強化されていない場合に発生します。 Always On 環境でのデータ同期プロセスの詳細については、「データ同期hronization Process」を参照してください。
トラブルシューティング
可用性データベースと 'AVAILABILITY_REPLICA' log_reuse_wait_desc
でログの増加につながる可能性があるシナリオは 2 つあります。
シナリオ 1: ログに記録された変更をセカンダリに配信する待機時間
トランザクションがプライマリ レプリカのデータを変更すると、これらの変更はログ レコード ブロックにカプセル化され、ログに記録されたブロックがセカンダリ レプリカのデータベース ログ ファイルに配信され、セキュリティが強化されます。 プライマリ レプリカは、ログ ブロックが配信され、すべてのセカンダリ レプリカの対応するデータベース ログ ファイルに書き込まれるまで、独自のログ ファイル内のログ ブロックを上書きできません。 可用性グループ内のレプリカへのこれらのブロックの配信またはセキュリティ強化に遅延が生じると、プライマリ レプリカのデータベースでログに記録された変更が切り捨てられなくなり、ログ ファイルの使用量が増加します。
詳細については、「 ネットワーク待機時間が長いか、ネットワーク スループットが低い場合、プライマリ レプリカでログがビルドアップされるを参照してください。
シナリオ 2: やり直しの待機時間
セカンダリ データベース ログ ファイルに対してセキュリティが強化されると、セカンダリ レプリカ インスタンスの専用再実行スレッドによって、含まれているログ レコードが対応するデータ ファイルに適用されます。 プライマリ レプリカは、すべてのセカンダリ レプリカのすべての再実行スレッドが含まれているログ レコードを適用するまで、独自のログ ファイル内のログ ブロックを上書きできません。
セカンダリ レプリカでの再実行操作が、そのセカンダリ レプリカでログ ブロックが強化される速度に追いつくことができない場合、プライマリ レプリカでログが増加します。 プライマリ レプリカは、すべてのセカンダリ レプリカの再実行スレッドが適用された時点まで、独自のトランザクション ログのみを切り捨てて再利用できます。 複数のセカンダリがある場合は、複数のセカンダリで
sys.dm_hadr_database_replica_states
動的管理ビューのtruncation_lsn
列を比較し、ログの切り捨てが最も遅れているセカンダリ データベースを特定します。Always On ダッシュボードと
sys.dm_hadr_database_replica_states
動的管理ビューを使用して、ログ送信キューと再実行キューを監視できます。 いくつかの重要なフィールドは次のとおりです。フィールド 説明 log_send_queue_size
セカンダリ レプリカに到着していないログ レコードの量 log_send_rate
ログ レコードがセカンダリ データベースに送信される速度。 redo_queue_size
まだ再実行されていないセカンダリ レプリカのログ ファイル内のログ レコードの量 (KB 単位)。 redo_rate
特定のセカンダリ データベースでログ レコードが再実行される速度 (KB/秒)。 last_redone_lsn
セカンダリ データベースで再実行された最後のログ レコードの実際のログ シーケンス番号。 last_redone_lsn
は常にlast_hardened_lsn
未満です。last_received_lsn
このセカンダリ データベースをホストするセカンダリ レプリカによってすべてのログ ブロックが受信されたポイントを識別するログ ブロック ID。 ゼロで埋め込まれたログ ブロック ID を反映します。 実際のログ シーケンス番号ではありません。 たとえば、プライマリ レプリカに対して次のクエリを実行して、最も古い
truncation_lsn
でレプリカを報告します。これは、プライマリが独自のトランザクション ログで再利用できる上限です。SELECT ag.name AS [availability_group_name] , d.name AS [database_name] , ar.replica_server_name AS [replica_instance_name] , drs.truncation_lsn , drs.log_send_queue_size , drs.redo_queue_size FROM sys.availability_groups ag INNER JOIN sys.availability_replicas ar ON ar.group_id = ag.group_id INNER JOIN sys.dm_hadr_database_replica_states drs ON drs.replica_id = ar.replica_id INNER JOIN sys.databases d ON d.database_id = drs.database_id WHERE drs.is_local=0 ORDER BY ag.name ASC, d.name ASC, drs.truncation_lsn ASC, ar.replica_server_name ASC
是正措置には、次のものが含まれますが、これらに限定されません。
- セカンダリにリソースやパフォーマンスのボトルネックがないことを確認します。
- 再実行スレッドがセカンダリでブロックされていないことを確認します。
lock_redo_blocked
拡張イベントを使用して、これがいつ発生し、再実行スレッドがブロックされているオブジェクトを識別します。
回避策
これを行うセカンダリ データベースを特定したら、次の 1 つ以上の方法を試して、この問題を一時的に回避してください。
問題のあるセカンダリの可用性グループからデータベースを取り出します。
Note
この方法では、セカンダリの高可用性/ディザスター リカバリー シナリオが失われます。 今後、可用性グループをもう一度設定する必要がある場合があります。
再実行スレッドが頻繁にブロックされる場合は、レプリカの
SECONDARY_ROLE
のALLOW_CONNECTIONS
パラメーターを NO に変更して、Readable Secondary
機能を無効にします。Note
これにより、ブロックの根本原因であるセカンダリ レプリカ内のデータをユーザーが読み取れなくなります。 再実行キューが許容可能なサイズに低下したら、この機能をもう一度有効にすることを検討してください。
自動拡張設定が無効になっており、使用可能なディスク領域がある場合は有効にします。
トランザクション ログ ファイルに達し、使用可能なディスク領域がある場合は、そのファイルの MaxSize 値を増やします。
現在のトランザクション ログ ファイルがシステムの最大 2 TB に達した場合、または別の使用可能なボリュームで追加の領域が使用可能な場合は、追加のトランザクション ログ ファイルを追加します。
詳細
SQL Server でトランザクション ログが予期せず増加したり、いっぱいになったりする理由の詳細については、「 完全なトランザクション ログをトラブルシューティングする (SQL Server エラー 9002)」を参照してください。
再実行操作のブロックの問題の詳細については、「 AlwaysON - HADRON Learning Series: lock_redo_blocked/redo worker Blocked on Secondary Replica」を参照してください。
AVAILABILITY_REPLICA ベースのlog_reuse_wait列の詳細については、「ログの切り捨てを遅らせる可能性がある要素を参照してください。
sys.dm_hadr_database_replica_states
ビューの詳細については、「sys.dm_hadr_database_replica_states (Transact-SQL)」を参照してください。到着せず、タイムリーに適用されていないログに記録された変更を監視およびトラブルシューティングする方法の詳細については、「Always On 可用性グループのパフォーマンスの監視を参照してください。
適用対象
- SQL Server 2012 Enterprise
- SQL Server 2014 Enterprise
- SQL Server 2014 Business Intelligence
- SQL Server 2014 Standard
- SQL Server 2016 Enterprise
- SQL Server 2016 Standard
- SQL Server 2017 Enterprise
- SQL Server 2017 Standard Windows