現象
Microsoft SQL Server 2012 または SQL Server 2014 データベースで AlwaysOn 可用性グループを使用していて、開いている大きなアクティブなトランザクションが存在し、ログ領域を追加する必要があるとします。 次のいずれかの理由でログファイルを拡張できない場合、トランザクションは失敗します。
-
追加のファイル領域がない
-
ログファイルが拡張されないように構成されている
-
ログファイルの最大サイズが設定されました
さらに、以下のエラー メッセージが表示されます。
エラー: 9002、レベル:17、状態: 9。データベース ' <データベース名> ' のトランザクションログは ' LOG_BACKUP ' のために完全な状態になっています。
ログのバックアップを実行した後、別の9002エラーメッセージが表示されます。
エラー: 9002、レベル:17、状態: 9。データベース ' <データベース名> ' のトランザクションログは ' ACTIVE_TRANSACTION ' のために完全な状態になっています。
別のログバックアップを行うと、別の9002エラーメッセージが表示され、その後に5901エラーメッセージが表示されます。
エラー: 9002、レベル:17、状態: 9。データベース ' <データベース名> ' のトランザクションログは ' AVAILABILITY_REPLICA ' のために完全な状態になっています。
ログの空き領域が不足しているため、データベース <データベース名> にチェックポイントレコードを書き込めませんでした。 データベース管理者に問い合わせて、ログの切り捨てまたはデータベースログファイルへの領域の割り当てを行います。エラー: 5901、レベル:16、状態: 1。データベース ' <データベース名> ' に属している1つ以上の回復ユニットが、チェックポイントを生成できませんでした。 通常、これは、ディスクやメモリなどのシステムリソースがない場合や、データベースが破損している場合に発生します。 このエラーの詳細については、エラーログの前のエントリを確認してください。
後続のチェックポイントまたはログバックアップがトランザクションのロールバック中に実行されると、次のエラーメッセージが表示されることがあります。
メッセージ3052、レベル16、状態1、行4バックアップログでデータベース ' <データベース名> ' の更新をログに記録できませんでした。 ログの記録が有効になった後は、ログ領域が使用可能になった後、' <lsn id 1> ' から ' <lsn id 2> ' へのバックアップポイントを進めるために、ログのバックアップが必要になります。
これらのメッセージを受信すると、データベースに新しいトランザクションを送信することはできなくなり、ログファイルを拡張したり、別のログファイルを追加したりすることはできなくなります。
解決方法
この問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
SQL Server 用の新しい累積更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正が含まれています。 SQL Server の最新の累積的な更新プログラムをダウンロードしてインストールすることをお勧めします。
回避策
次の回避策を使用して、ログと再開アクティビティを切り捨てることができます。
-
各セカンダリレプリカを確認して、セカンダリレプリカ last_hardened_lsn ( sys.dm_hadr_database_replica_statesを参照) がプライマリレプリカ last_hardened_lsnと一致することを確認します。 これを行うには、プライマリレプリカインスタンスに接続している次のクエリを実行します。
SELECT ags.name as AGGroupName, ar.replica_server_name as InstanceName, hars.role_desc, db_name(drs.database_id)as DBName, drs.last_hardened_lsn, drs.log_send_queue_size, drs.synchronization_state_desc as SyncState, ar.availability_mode_desc as SyncMode, CASE drs.is_local WHEN 1 THEN drs.database_id ELSE NULL END as database_id FROM sys.dm_hadr_database_replica_states drs LEFT JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id LEFT JOIN sys.availability_groups ags ON ar.group_id = ags.group_id LEFT JOIN sys.dm_hadr_availability_replica_states hars ON ar.group_id = hars.group_id and ar.replica_id = hars.replica_id WHERE db_name(drs.database_id) = '<database name>'
-
プライマリレプリカの場合
-
[可用性] グループからデータベースを削除します。
-
データベースを [可用性] グループに追加し直します。
-
-
各セカンダリレプリカの場合
-
データベースを [可用性] グループに追加し直します。
-
可用性グループからデータベースを削除すると、そのログはすぐに切り捨てられ、ログ領域が解放されます。各セカンダリレプリカの last_hardened_lsn がプライマリレプリカと同一であり、[可用性] グループからデータベースを削除して、各セカンダリでデータベースをもう一度追加しても、セカンダリレプリカは正常に再追加され、セカンダリ上のログのバックアップを復元する必要がなくなります。セカンダリレプリカがプライマリレプリカの最新の状態ではなく、セカンダリレプリカを取得する前に可用性グループからデータベースを削除する必要がある場合は、そのセカンダリレプリカを可用性グループに再度追加する前にログバックアップを取得する必要がある可能性があります。または、セカンダリレプリカでデータベースを削除して、完全なトランザクションログデータベースのバックアップでそれを
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。