エラー 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プライマリ レプリカです。
- トランザクション ログ ファイルの自動拡張オプションは、SQL Serverで設定されます。
このシナリオでは、トランザクション ログが大きくなり、ディスク領域が不足したり、プライマリ レプリカのトランザクション ログに設定されている MaxSize オプションを超えたりして、次のようなエラー メッセージが表示される場合があります。
エラー: 9002、重大度: 17、状態: 9。 'AVAILABILITY_REPLICA' が原因でデータベース '%.*ls' のトランザクション ログがいっぱいです
原因
これは、プライマリ レプリカでログに記録された変更がまだセカンダリ レプリカで強化されていない場合に発生します。 Always On環境でのデータ同期プロセスの詳細については、「データ同期プロセス」を参照してください。
トラブルシューティング
可用性データベースと '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
是正措置には、次のものが含まれますが、これに限定されるわけではありません。
- セカンダリにリソースまたはパフォーマンスのボトルネックがないことを確認します。
- セカンダリで Redo スレッドがブロックされていないことを確認します。 拡張イベントを
lock_redo_blocked
使用して、これがいつ発生し、再実行スレッドがブロックされているオブジェクトを特定します。
回避策
これを発生させるセカンダリ データベースを特定したら、次の 1 つ以上の方法を試して、この問題を一時的に回避してください。
問題のあるセカンダリの可用性グループからデータベースを取り出します。
注:
この方法では、セカンダリの高可用性/ディザスター リカバリー シナリオが失われます。 今後、可用性グループを再度設定する必要がある場合があります。
やり直しスレッドが頻繁にブロックされる場合は、レプリカの
Readable Secondary
の パラメーターSECONDARY_ROLE
をALLOW_CONNECTIONS
NO に変更して、機能を無効にします。注:
これにより、ブロックの根本原因であるセカンダリ レプリカ内のデータをユーザーが読み取れなくなります。 やり直しキューが許容可能なサイズに低下したら、もう一度機能を有効にすることを検討してください。
自動拡張設定が無効になっており、使用可能なディスク領域がある場合は、この設定を有効にします。
トランザクション ログ ファイルに到達し、使用可能なディスク領域がある場合は、そのトランザクション ログ ファイルの MaxSize 値を増やします。
現在のトランザクション ログ ファイルがシステムの最大 2 TB に達した場合、または別の使用可能なボリュームで追加の領域を使用できる場合は、追加のトランザクション ログ ファイルを追加します。
詳細
トランザクション ログが予期せず拡大したり、SQL Serverがいっぱいになったりする理由の詳細については、「完全なトランザクション ログのトラブルシューティング (SQL Server エラー 9002)」を参照してください。
やり直し操作のブロックの問題の詳細については、「 AlwaysON - HADRON Learning Series: lock_redo_blocked/再実行ワーカーがセカンダリ レプリカでブロックされました」を参照してください。
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