KB3095156 - 2012 年または 2014 年 SQL Server SQL Serverにログ ファイルを追加またはバックアップしようとすると、エラー 9002 とエラー 3052 が修正されました

適用先
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

現象

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の最新の累積的な更新プログラムをインストールする

SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムをダウンロードしてインストールすることをお勧めします。

      

回避策

次の回避策を使用して、ログを切り捨ててアクティビティを再開できます。

  1. 各セカンダリ レプリカを確認して、セカンダリ レプリカの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>'
    
  2. プライマリ レプリカ上

    • 可用性グループからデータベースを削除します。
    • 可用性グループにデータベースを再追加します。
  3. 各セカンダリ レプリカで

    • 可用性グループにデータベースを再追加します。

可用性グループからデータベースを削除すると、すぐにログが切り捨てられ、ログ領域が解放されます。

各セカンダリ レプリカのlast_hardened_lsnがプライマリ レプリカと同じであり、可用性グループからデータベースを削除し、各セカンダリ上のデータベースを再追加している間にログ バックアップが作成されない場合、セカンダリ レプリカはエラーなしで再追加され、セカンダリ レプリカは正常に再追加されます。セカンダリ レプリカは、セカンダリ 上のログ バックアップを復元する必要がありません。

セカンダリ レプリカがプライマリ レプリカに最新ではなく、セカンダリがキャッチアップする前に可用性グループからデータベースを削除する必要がある場合、セカンダリ レプリカはログ バックアップを復元して可用性グループに再追加する前にログ バックアップを復元するか、セカンダリ レプリカ上のデータベースを削除して完全なトランザクション ログ データベース バックアップで再シードする必要があります。

状態

Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。