図1●高速復旧オプションの概要<BR>ユーザーは,トランザクション・ログがリドゥ(ロール・フォワード)された後で,復元中のデータベースに再接続できる。
図1●高速復旧オプションの概要<BR>ユーザーは,トランザクション・ログがリドゥ(ロール・フォワード)された後で,復元中のデータベースに再接続できる。
[画像のクリックで拡大表示]
図2●段階的な部分バックアップの仕組み&lt;BR&gt;バックアップ/復元をファイル・グループ単位で扱い,特定のファイル・グループをバックアップ/復元できる。データベース内のファイル・グループを,読み書き用のファイル・グループと読み取り専用のファイル・グループに分けてバックアップする。単純モデル・データベースの例
図2●段階的な部分バックアップの仕組み<BR>バックアップ/復元をファイル・グループ単位で扱い,特定のファイル・グループをバックアップ/復元できる。データベース内のファイル・グループを,読み書き用のファイル・グループと読み取り専用のファイル・グループに分けてバックアップする。単純モデル・データベースの例
[画像のクリックで拡大表示]
図3●ファイル・グループAの部分バックアップのためのBackup構文&lt;BR&gt;ファイル・グループA(読み書き可能)をバックアップしたい場合の例。
図3●ファイル・グループAの部分バックアップのためのBackup構文<BR>ファイル・グループA(読み書き可能)をバックアップしたい場合の例。
[画像のクリックで拡大表示]
図4●ファイル・グループB,Cの部分バックアップを実行する構文&lt;BR&gt;読み込み専用のファイル・グループのバックアップを取る場合は,このBackup構文を実行する。
図4●ファイル・グループB,Cの部分バックアップを実行する構文<BR>読み込み専用のファイル・グループのバックアップを取る場合は,このBackup構文を実行する。
[画像のクリックで拡大表示]
図5●段階的な部分復元の例&lt;BR&gt;プライマリ・ファイル・グループと復元対象のファイル・グループAを優先的に復元した時点で,データベースが利用可能となる。単純モデル・データベースの場合。
図5●段階的な部分復元の例<BR>プライマリ・ファイル・グループと復元対象のファイル・グループAを優先的に復元した時点で,データベースが利用可能となる。単純モデル・データベースの場合。
[画像のクリックで拡大表示]
図6●部分復元を実行する構文&lt;BR&gt;部分復元ではWITH PARTIAL句を付けて実行する。ここでは読み書き可能なファイル・グループを復元している。
図6●部分復元を実行する構文<BR>部分復元ではWITH PARTIAL句を付けて実行する。ここでは読み書き可能なファイル・グループを復元している。
[画像のクリックで拡大表示]

▼データベース管理システムを運用する上で,重要な項目の1つに,障害からの復旧作業がある。特に高可用性システムにおける復旧作業は短時間で行え,かつ正確であることが必須である。
▼SQL Server 2005には,ストレージ・サブシステムに関する障害からの復元とアプリケーションまたはユーザーのエラーからの復元の両方に対して,処理時間を短縮する新機能が実装される。

 データベース管理システム(DBMS)を運用していると,様々なトラブルに見舞われる可能性がある。ハードウエアの故障や,OSやネットワークの障害のみならず,アプリケーション・エラーまたはユーザーやデータベース管理者の操作ミスからの人為的なエラーによるシステム停止なども考えられる。そのため,DBMSを運用する上で,バックアップや障害時の復元作業は不可欠だ。特に高可用性システムにおける復旧作業は短時間で行え,かつ正確であることが求められる。

 SQL Server 2005では,「ストレージ・サブシステムが関係するハードウエア関連の障害」「アプリケーションまたはユーザーのエラー」の両方に対するバックアップ/リストア処理を高速化するための機能を大幅に強化した。

 まず「ストレージ・サブシステムが関係するハードウエア関連の障害」への対処について説明しよう。

復元すべき範囲別に機能を用意

 バックアップとリストアは,ディスク・サブシステムが関係するハードウエア関連の問題を回復するための一般的な方法である。ディスク・サブシステムに障害が発生すると,データを読み取れなくなったり,データが何らかの損傷を受けたりする。この問題は,ディスクの広い範囲が利用できなくなる障害と,ページという特定の部分が利用できなくなる障害に分けられる。

 ディスクの広い範囲が利用できなくなる場合の原因は,ディスク・ドライブ,ディスク・コントローラ,またはほかのディスク・サブシステム・コンポーネントの障害である。通常は,読み取りまたは書き込みのエラーとしてハードウエアがOSに通知する。しかし場合によっては,ハードウエアの障害が通知されないまま処理が進み,後でDBMSまたはアプリケーションから通知されることがある。

 一方のページの障害とは次のようなものである。SQL Serverでは,データを8Kバイトのページに分けて格納する。読み取りまたは書き込みは,常にページを単位として行われる仕組みだ。何らかの原因で不完全な書き込みが行われ,ページを構成するディスク・セクターの一部にデータが正しく格納されなかった場合は,破損ページが作成される。SQL Serverは,元々,破損ページを検出する機能を備えており,障害として通知される。

 壊れたデータを修復する場合は,破損の範囲を特定する必要がある。

 破損ページが発生した場合は,PHYSICAL_ONLYオプションを指定してDBCC CHECKDBコマンドを実行すると復元できる。また,インデックス*だけが壊れたときは,インデックスを作り直す方法で対処できる。

復元の早い段階でDBが利用可能

 しかし,ディスクの広い範囲に問題が出たときには,バックアップからの復元作業が必要になる。

 データベースを復元して稼働させるまでには一般に次のステップを踏む。

(1)ファイルの作成と初期化
(2)データおよびトランザクション・ログ*のコピー
(3)リドゥ(ロール・フォワード)
(4)アンドゥ(ロール・バック)

 総所要時間は,この4つのステップの合計になる。SQL Server 2005では各ステップについて,機能を強化し,システム修復の所要時間を短縮している。

 まず「ファイルの作成と初期化」の時間は大幅に短縮された。SQL Server 2005では,大規模なデータベース(VLDB)の作成時や既存のデータベースのサイズ拡張または復元時の初期化は,ファイル・サイズを「0」にして作成することで瞬時に済ませている。

 次の「データおよびトランザクション・ログのコピー」ではDBMSが稼働しているオンライン状態での処理を可能にして実質的な高速化を実現している。

 この処理は,バックアップ・メディアから,データとトランザクション・ログをデータベースにコピーするステップである。前バージョンのSQL Server 2000では,破損したページ,デバイス,ファイルなどをオフライン状態にしてから復元する必要があり,その間は復元対象となるデータベースを使用できなかった。特に,大規模なデータベースでは停止状態が長くなり,可用性に問題が出る場合があった。

 これに対してSQL Server 2005では,後述のようにファイル・グループ*というデータベースの一部の復元が可能になる。オンライン中でもこの復元処理は可能で,可用性の向上に貢献している。

 またリドゥ(ロール・フォワード)とアンドゥ(ロール・バック)では,高速復元オプションを用意して処理時間を短縮している(図1[拡大表示])。

 リドゥは,バックアップからコピーしたトランザクション・ログを読み取り,ログに記録された変更内容をデータ・ページに適用して,データベースを障害が起きる直前の状態にする処理だ。アンドゥは,復元の最終フェーズで,アクティブなすべてのトランザクションによって行われた不完全な変更を戻す処理である。障害発生時点のデータベースは,一般にトランザクション*コミット*またはロール・バックしている最中の状態である。そこで,すべての完了していないトランザクションをいったんロール・バックしないとデータに矛盾が生じてしまう。アンドゥが終了するとデータベースは復旧したとみなされ,再び利用可能になる。

 SQL Server 2005が備える新しい高速復元オプションを使えば,こうした処理が効率的に行われる。ユーザーは,トランザクション・ログがリドゥされた後に,復元中のデータベースへ再接続できる。

 従来のSQL Server 2000までは,ユーザーがデータベース内の影響を受けた部分にアクセスする必要がない場合でも,不完全なトランザクションがロール・バックされるまで待つ必要があった。一括操作(一括読み込みやインデックス作成など)の場合や,変更量が多いその他のトランザクションの場合は,かなり処理時間が長くなることがある。

 これに対してSQL Server 2005のアンドゥのフェーズでは,データベースに対する読み取り/書き込み操作をロール・バックと並行して実行できる。ただし,ロール・バックによって元に戻すフェーズにあってロックされたデータにアクセスする操作は例外である。元に戻す処理がそのデータのロックを解除するまで,データベース内で通常のブロッキングを受ける。

部分的なバックアップ/復元を実現

 SQL Server 2005では,大規模データベースのバックアップ/復元を高速化して可用性を向上させる機能も充実した。具体的には「段階的な部分バックアップ(Piecemeal Backup)」と「段階的な部分復元(Piecemeal Restore)」と呼ぶ新機能を備えている。

 これは,バックアップ/復元をファイル・グループ単位で扱い,特定のファイル・グループを選択的にバックアップ/復元できる機能である。大規模なデータベースの復元には特に有効で,早急に必要なデータ部分を含むファイル・グループから復旧を始め,データベースをすぐオンラインにするときに役立つ。

 このPiecemeal Backupを使用するため,RESTORE構文にPARTIAL句オプションが追加された。通常,データベースはファイルをすべて復元しないと利用できない。しかし,このPARTIAL句オプションを利用して復元すると,一部のファイル・グループを復元しただけで,データベースをオンラインにできる。

 図2([拡大表示])ではデータベース内のファイル・グループを読み書き用のファイル・グループと読み取り専用のファイル・グループに分けてバックアップしている。このようなデータベースで,ファイル・グループA(読み書き可能)を部分的にバックアップしたい場合,図3([拡大表示])のBackup構文を実行する。この例で示したように,「READ_WRITE_FILEGROUPS」オプションを指定すると,読み書き可能なファイル・グループAとプライマリ・ファイル・グループのデータがバックアップされる。

 ここで出てきたプライマリ・ファイル・グループには,データベースのメタデータ(システム・テーブルのデータ)が保存・管理されている。対象の正味データが入っているファイル・グループAはもちろんバックアップするのだが,併せてプライマリ・ファイル・グループを一緒にバックアップ/復元しないと,復旧後にオブジェクトを操作できない。

 その他の読み込み専用ファイル・グループをバックアップする場合は,図4([拡大表示])のBackup構文を実行する。このときはオプションを特に付ける必要はない。

 段階的な部分復元は,こうして作成した部分的なバックアップをリストアする処理である。図5([拡大表示])に示すように,プライマリ・ファイル・グループと復元対象のファイル・グループを優先的に復元した時点で,データベース(ここではMyDB)が利用可能となる。

 部分復元の構文は図6([拡大表示])の通りで,WITH PARTIAL句を付けて実行する。まずは,読み書き可能なファイル・グループを戻すことが必要で,ここではその例を示している。これだけでは,復元前のファイル・グループBやCのデータは利用できないが,メタデータやファイル・グループAの復元だけで実行可能な処理がある場合に役立つだろう。

笹瀬 行弘

マイクロソフト
プロダクト ディベロップメント リミテッド ウィンドウズサーバーシステム開発統括部 SQL Serverグループ リージョナル プログラムマネージャ