マルチストライピングがある VDI アプリケーションを使用して SQL Server データベースを復元すると、エラー 3456 で失敗する可能性があります
この記事は、仮想デバイス インターフェイス (VDI) ベースのアプリケーションを使用して SQL Server データベースを復元するときに発生する問題を解決するのに役立ちます。
現象
SQL Server 2019 以降でマルチストライプ 仮想デバイス インターフェイス (VDI) 完全バックアップを復元すると、次のエラー MSSQLSERVER_3456発生する可能性があります。
Msg 3456, Level 16, State 1, Line <LineNumber>
Could not redo log record (120600:18965748:1), for transaction ID (0:1527178398), on page (14:1987189), allocation unit 72057761533001728, database 'DB1_STRIPE' (database ID 8).
Page: LSN = (120598:23255372:8), allocation unit = 72057761317781504, type = 1. Log: OpCode = 6, context 2, PrevPageLSN: (120600:18965371:85).
原因
SQL Server は、VDI にバックアップするときに、バッファーを介して VDI にデータを渡します。 その後、VDI は、そのバックアップを格納する方法の書式設定を処理します。 ただし、多くの場合、VDI クライアントでは各データ ページのコピーが 1 つだけ必要になる場合があります。
バックアップを VDI にストライプすると、複数のバックアップ デバイスが完全バックアップの内容を構成します。 データは非同期に書き込まれ、データ コピーの順序は VDI クライアントのロジックによって処理されます。 データ コピー フェーズは非同期であるため、データを順を追って書き込むことができます。 ただし、SQL Server 2019 より前の完全バックアップ シナリオでは、データ ページごとに 1 つのコピーしかありません。 そのため、VDI クライアントが SQL Server が復元のために読み取るバッファーにデータを送信しても、SQL Server は各データ ページを復元する場所と方法を正確に把握できます。 SQL Server 2019 で遅延ログのピン留めを導入すると、データ ページの複数のコピーがバックアップ ファイルに見つかる可能性があります。 完全バックアップ内でミニ差分バックアップが行われているため、複数のコピーが存在します (詳細については、「 詳細 」セクションを参照してください)。 VDI クライアントは、同じデータ ページの複数のコピーを予期していないか、間違った順序でデータ ページを SQL Server に渡します。 この動作により、復元エラーが発生します。 エラー 3456 Could not redo log record
は、SQL Server が最新バージョンのデータ ページを想定しているが、古いバージョンが見つかるログ レコードを適用しようとしていることを示します。
解決方法
構成に応じて、SQL Server インスタンスのスタートアップ パラメーターとして 1 つ以上のトレース フラグを有効にする必要があります。
インスタンスがプライマリ レプリカまたは可用性グループのないインスタンスとして機能しているときに完全バックアップを作成する場合は、トレース フラグ 3471 を有効にして、完全バックアップの遅延ログピン留め機能を無効にします。
インスタンスがプライマリ レプリカまたは可用性グループのないインスタンスとして機能しているときに差分バックアップを作成する場合は、トレース フラグ 3475 を有効にして、差分バックアップの遅延ログピン留め機能を無効にします。
インスタンスがセカンダリ レプリカとして動作しているときに COPY_ONLY を使用して完全バックアップを作成する場合は、トレース フラグ 3472 を有効にして、差分バックアップの遅延ログピン留め機能を無効にします。
SQL Server を再起動してください。
完全バックアップまたは差分バックアップをもう一度実行します。
Note
DBCC TRACEON コマンドを使用して、これらのトレース フラグを一時的に有効にすることもできます。
DBCC TRACEON(3471,3472,3475,-1)
SQL Server インスタンスをすぐに再起動できない場合は、このコマンドを使用して問題を軽減できます。
重要
この問題により、次の条件に該当する場合、既存のバックアップは復元できない可能性があります。
- バックアップは、遅延ログのピン留め機能が有効になっている状態で作成されます。
- バックアップ ツールは VDI を使用しています。
- バックアップはマルチストライピング (複数のファイルへのバックアップ) を使用して行われます。
既存のバックアップをテスト サーバーに復元して、正常に復元できるかどうかを確認することをお勧めします。
詳細
SQL Server 2019 には、遅延ログのピン留めと呼ばれる機能が導入されています。 この機能を導入する前に、データベースの完全バックアップ中に、SQL Server はトランザクションの実行をブロックし (ログをピン留め)、データとログをコピーしてから、最初にピンを削除します。 この機能が存在すると、SQL Server はトランザクションの発生を遅らせ (ログをピン留め)、バックアップ期間の最後に進みます。最初は実行されません。 この機能は、完全バックアップ中に完了に時間がかかる完全なトランザクション ログの問題 (MSSQLSERVER_9002 エラー) を回避するように設計されています。 ログのピン留めは遅延されるため、バックアップの進行中は、トランザクションをデータベースのデータ ページに適用できます。 SQL Server では、進行中の完全バックアップの開始時刻以降に変更されたページを識別するためのビットマップが保持されるため、ミニ差分バックアップを実行できます。 この方法では、データベース全体のバックアップ中に変更された各データ ページの更新されたコピーが取得されます。 これにより、一部のデータ ページの追加コピーが発生します。 さらに、完全バックアップのこの追加セクションが作成されます。