SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Availability Groups を使用した自動ページ修復

leave a comment

SQL Server 2008 R2 までのミラーリングでは、破損ページが見つかった場合にセカンダリから対象のページを読み込み自動的に修復するする機能が実装されていました。

この機能ですが Availability Groups でも実装がされています。

今回の投稿では自動ページ修復についてみていきたいと思います。

■Availability Groups を使用した自動ページ修復


基本的な動作はミラーリングと変わらないようです。
Availability Groups の場合、セカンダリのデータベースを読み込むことができますが、セカンダリでページ破損が見つかった場合でも自動でページ修復をしてくれるようです。

それでは実際に自動ページ修復の動作を確認してみたいと思います。

ページ修復を試すためにはページの情報を破損させる必要があります。

まずは破損させるページのページ番号を取得します。
以下のクエリを実行してページ番号を確認します。

USE [AlwaysOnDB]
GO
SELECT * FROM Table_1
CROSS APPLY sys.fn_PhysLocCracker(%%physloc%%)

image

今回はこの 172 ページのデータを破損させてみます。

一度 SQL Server のサービスを停止し、バイナリエディタでデータファイルを開きます。
# 今回は Stirling というバイナリエディタを使用しています。

image

バイナリエディタでファイルを開いたら、破損させるページのアドレスに移動します。
SQL Server 2012 CTP3 で試したところ、ページ番号 × 8192 (0x2000) のアドレスに移動すると対象のページの情報になるようです。

今回は 172 ページを破損させるので 172 × 8192 = 1409024 = 0x158000 に移動します。
image

SQL Server のページは 8KB ページですので、1409024 (0x158000 ) ~ 1409024 + 8192 -1 ( 0x159FFF) が対象のページの全データになります。
そこで、アドレス指定で範囲選択をし、
image

選択範囲を 0 で初期化し、ページを破損させます。
image

編集が終わったらファイルを保存して、SQL Server のサービスを起動します。

サービスが起動したら先ほど実行したクエリを再度実行します。
image

先ほど編集をした172 ページ (オフセット 0x00000000158000) が破損しているということで検出がされました。
初回の実行はページ破損を検出するためにエラーとなるのですが、二回目を実行すると正常にデータを取得することが可能です。
image

初回の実行は破損の検出になるのですが、破損が検出されたことにより自動ページ修復が行われ、他のサーバーから対象のページを取得し、破損ページが自動的に修復されます。

Availability Groups では、DBCC CHECKDB をセカンダリで実行することができますので、セカンダリでデータベースの整合性を確認し、破損ページが見つかったら他のサーバーのデータを使用して自動修復をすることも可能となっています。

全サーバーで同一のページが破損しているとどうしようもないと思いますが、Availability Groups を利用して、セカンダリを利用したデータベースの整合性確認 + 異常があった場合のリカバリを計画することができそうですね。

Written by masayuki.ozawa

11月 5th, 2011 at 12:05 am

Posted in SQL Server

Tagged with , ,

Leave a Reply

*