現象
Microsoft SQL Server 2012 または SQL Server 2014 データベースで AlwaysOn 可用性グループを使用し、大規模なオープン アクティブ トランザクションが存在し、追加のログ領域が必要であるとします。 次のいずれかの理由でログ ファイルを拡張できない場合、トランザクションは失敗します。
- 追加のファイル領域がない
- ログ ファイルが拡張されないように構成されている
- ログ ファイルの構成済みの最大サイズに達しました
さらに、以下のエラー メッセージが表示されます。
注
エラー: 9002、重大度: 17、状態: 9。
データベース '<database name>' のトランザクション ログは、'LOG_BACKUP' が原因でいっぱいです。
ログ バックアップを実行すると、別の 9002 エラー メッセージが表示されます。
注
エラー: 9002、重大度: 17、状態: 9。
データベース '<database name>' のトランザクション ログは、'ACTIVE_TRANSACTION' が原因でいっぱいです。
別のログ バックアップの後に、別の 9002 エラー メッセージの後に 5901 エラー メッセージが表示されます。
注
エラー: 9002、重大度: 17、状態: 9。
データベース '<database name>' のトランザクション ログは、'AVAILABILITY_REPLICA' が原因でいっぱいです。
注
ログが領域不足のため>データベース<データベース名にチェックポイント レコードを書き込めませんでした。 データベース管理者に問い合わせて、ログを切り捨てるか、データベース ログ ファイルにさらに領域を割り当てます。
エラー: 5901、重大度: 16、状態: 1。
データベース '<database name>' に属する 1 つ以上の復旧ユニットがチェックポイントを生成できませんでした。 これは通常、ディスクやメモリなどのシステム リソースが不足しているか、場合によってはデータベースの破損が原因で発生します。 エラー ログ内の以前のエントリを調べて、このエラーの詳細を確認します。
トランザクションのロールバック中に後続のチェックポイントまたはログ バックアップが作成されると、次のエラー メッセージが表示される場合があります。
注
Msg 3052、レベル 16、状態 1、4 行目
BACKUP LOG では、データベース '<database name>' の更新をログに記録できませんでした。 ログ領域がログ記録に使用できるようになった後、バックアップ ポイントを '<LSN id 1>' から '<LSN id 2>' に進める必要があります。
これらのメッセージを受信すると、新しいトランザクションをデータベースに送信できなくなり、ログ ファイルを拡張したり、別のログ ファイルを追加したりすることはできません。
解決策
この問題は、SQL Serverの次の累積的な更新プログラムで最初に修正されました。
- SQL Server 2014 SP1 の累積的な更新プログラム 3
- SQL Server 2014 の累積的な更新プログラム 10
- SQL Server 2012 SP2 の累積的な更新プログラム 8
推奨事項: SQL Serverの最新の累積的な更新プログラムをインストールする
SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムをダウンロードしてインストールすることをお勧めします。
- SQL Server 2014 SP1 の最新の累積的な更新プログラム
- SQL Server 2014 の最新の累積的な更新プログラム
- SQL Server 2012 SP2 の最新の累積的な更新プログラム
回避策
次の回避策を使用して、ログを切り捨ててアクティビティを再開できます。
各セカンダリ レプリカを確認して、セカンダリ レプリカの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がプライマリ レプリカと同じであり、可用性グループからデータベースを削除し、各セカンダリ上のデータベースを再追加している間にログ バックアップが作成されない場合、セカンダリ レプリカはエラーなしで再追加され、セカンダリ レプリカは正常に再追加されます。セカンダリ レプリカは、セカンダリ 上のログ バックアップを復元する必要がありません。
セカンダリ レプリカがプライマリ レプリカに最新ではなく、セカンダリがキャッチアップする前に可用性グループからデータベースを削除する必要がある場合、セカンダリ レプリカはログ バックアップを復元して可用性グループに再追加する前にログ バックアップを復元するか、セカンダリ レプリカ上のデータベースを削除して完全なトランザクション ログ データベース バックアップで再シードする必要があります。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。