KB3054530 - 修正: セカンダリ レプリカを読み取り不能に変更すると、セカンダリ レプリカのページで破損が発生する

適用先
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

現象

Microsoft SQL Server 2012 で AlwaysOn 可用性グループ機能を使用することを想定しています。 セカンダリ レプリカの接続アクセスを "読み取り可能" から "読み取り不可" に変更すると、特定のレプリカでページ圧縮を使用するページで破損が発生します。

セカンダリ レプリカでこの問題が発生した可用性データベースは、同期の再実行フェーズ中にエラーが発生したため復旧できません。 セカンダリ レプリカはプライマリ レプリカと同期されず、"SUSPEND_FROM_REDO" の同期状態が報告されます。さらに、セカンダリ レプリカをホストするSQL Serverのエラー ログに次のエラー メッセージが表示されます。

< 日付><時間> spid<ID> エラー: 17066、重大度: 16、状態: 1。
< 日付><時間>spid<ID> SQL Server Assertion: File: <page.cpp>,line=3898 Failed Assertion = '!pageFull'. このエラーはタイミングに関連している可能性があります。 ステートメントの再実行後もエラーが解決しない場合は、DBCC CHECKDB を使用してデータベースの構造整合性をチェックするか、サーバーを再起動してメモリ内のデータ構造が破損しないようにします。
< 日付><時間> spid<ID> エラー: 3624、重大度: 20、状態: 1。
< 日付><時間>spid<ID> システム アサーション チェックが失敗しました。 詳細については、SQL Serverエラー ログを確認してください。 通常、アサーションエラーはソフトウェアのバグまたはデータの破損によって発生します。 データベースの破損をチェックするには、DBCC CHECKDB の実行を検討してください。 セットアップ中に Microsoft にダンプを送信することに同意した場合は、ミニ ダンプが Microsoft に送信されます。 更新プログラムは、最新の Service Pack またはテクニカル サポートの QFE で Microsoft から入手できる場合があります。
< 日付><時間> spid<ID> データベース '<DataBase Name>' の AlwaysOn 可用性グループのデータ移動は、"system" (ソース ID 2;ソース文字列: 'SUSPEND_FROM_REDO')。 データベースのデータ移動を再開するには、データベースを手動で再開する必要があります。 可用性データベースを再開する方法については、「オンライン ブックのSQL Server」を参照してください。
< 日付><時間> spid<ID> エラー: 3313、重大度: 21、状態: 2。
< 日付><時間> spid<ID> データベース '<DataBase Name>' でログに記録された操作のやり直し中に、ログ レコード ID (1786:4978584:74) でエラーが発生しました。 通常、特定のエラーは、以前は Windows イベント ログ サービスでエラーとして記録されます。 データベースを完全バックアップから復元するか、データベースを修復します。
< 日付><時間> spid<ID> ALTER DB パラメーター オプション: RESUME
< 日付><時間> spid<ID> データベース '<DataBase Name>' の AlwaysOn 可用性グループのデータ移動が再開されました。 これは情報メッセージのみです。 ユーザー アクションは必要ありません。
< 日付><時間> spid<ID> AlwaysOn 可用性グループの状態変更に関して、データベース <DataBase Name> で非修飾トランザクションがロールバックされます。 ロールバックの推定完了: 100% これは情報メッセージのみです。 ユーザー アクションは必要ありません。
< 日付><時間> spid<ID> レプリカ ID を持つ可用性レプリカのセカンダリ データベース '<DataBase Name>' のプライマリ データベースとの AlwaysOn 可用性グループ接続: {bbdedecb-f26b-47e9-9e7d-7c22f99edb23}。 これは情報メッセージのみです。 ユーザー アクションは必要ありません。
< 日付><時間> spid<ID> データベース '<DataBase Name>' の起動。
< 日付><時間> spid<ID> データベース '<DataBase Name>' (13) の復旧は 0% 完了です (約 781 秒が残ります)。 フェーズ 1/3。 これは情報メッセージのみです。 ユーザー アクションは必要ありません。
……

解決策

この問題は、SQL Serverの次の累積的な更新プログラムで最初に修正されました。

SQL Server 2012 SP2 の累積的な更新プログラム 6

            
             SQL Server 2012 SP1 の累積的な更新プログラム 16
          

SQL Server 用の累積的な更新プログラムについて

SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムを確認してください。

      

追加情報

前の問題は、セカンダリ レプリカの読み取りアクセスが変更されたときに発生する可能性があります。
セカンダリ レプリカ上の可用性データベースの読み取りアクセスを設定するには、次の 2 つの方法を使用します。

  • ALTER AVAILABILITY GROUP コマンドを使用して読み取りアクセスを設定します。

    ALTER AVAILABILITY GROUP [AGName]
    MODIFY REPLICA ON N'<SRV>' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = NO))
    
  • 読み取りアクセス権を設定するには、SQL Server Management Studio (SSMS) のオブジェクト エクスプローラーの設定を変更します。

    • サーバーに接続し、AlwaysOn 可用性フォルダーを開きます。
    • [可用性グループ] フォルダーを開きます。
    • 可用性グループを右クリックし、[プロパティ] を選択します。
    • セカンダリ レプリカの読み取り可能なセカンダリ プロパティを [いいえ] に変更し、[OK] をクリックします。

状態

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