止められないデータベースの高可用性と災害対策DB2マイスター養成講座(5)(1/2 ページ)

ダウンタイムが許されないシステムにおける可用性の確保は、最重要課題である。ストレージやHAクラスタの導入が必要になるだろう。(編集局)

» 2004年02月10日 00時00分 公開
[小林慶彦@IT]

 前回はデータベースの可用性について、バックアップ/リカバリという観点で解説しました。しかし、バックアップ/リカバリだけでは十分な可用性が得られない場合もあります。例えば、テープ装置などにバックアップを保存している場合は、テープから必要なバックアップイメージを読み込んでDB2へリストアする時間が必要です。さらに、最新の状態へ戻すにはロールフォワードが必要です。テープ装置の種類やデータベースの容量にもよりますが、一定時間はシステムが止まってしまうことが容易に想像できます。

 そこで今回は、「データベース(システム)を止めない」ことをテーマに、HAクラスタやストレージの遠隔コピー機能を使った高可用性/ディザスタ・リカバリについて解説します。

データベースの障害(非計画停止)

 まずは、データベースの障害について前回の復習をしましょう。データベースの障害は、以下の4つに大別できました。

  • データベースの論理障害
  • ストレージ・ディスクの障害
  • サーバの障害
  • サイトの障害

 それぞれの障害に対するバックアップ/リカバリ方式は、以下の表のようにまとめることができました。

想定される障害 バックアップ/リカバリ方式
データベースの論理障害 DB2クラッシュ・リカバリー(DB2機能)
DB2バックアップ/リストア(DB2機能)
ストレージ・ディスク障害 DB2バックアップ/リストア(DB2機能)
ローカル・コピー機能(ハード/ソフト機能)
サーバの障害 DB2クラッシュ・リカバリー(DB2機能)
ローカル・フェイルオーバー(HAクラスタ)
レプリケーション(DB2機能)
ログ・シッピング(DB2機能)
サイト全体の障害 DB2クラッシュ・リカバリー(DB2機能)
DB2バックアップ/リストア(DB2機能)
グローバル・フェイルオーバー(HAクラスタ)
遠隔コピー機能(ハード/ソフト機能)
レプリケーション(DB2機能)
ログ・シッピング(DB2機能)

 前回はDBMSの機能としてのバックアップ/リストアを中心に紹介しましたが、今回はストレージのコピー機能を使ったバックアップ/リカバリを紹介します。

高速コピー機能を使ったバックアップ/リカバリ

 最近の大容量ストレージは、サーバに負荷を掛けない高速なコピー機能を持ったものが主流になっています。IBM ESS(Enterprise Storage Server)のFlashCopyや日立SANRISEのShadowImage、EMC SymmetrixのTimeFinderなどがそれに当たります。

 コピー方式やリカバリ方式はさまざまですが、どれも論理ボリューム単位(LU)でデータを高速にコピーすることが可能です。特にデータ量が膨大で、止められないシステムのバックアップ/リカバリには最適なソリューションです。

 前回も触れたように、コピー機能を使う際に注意が必要なのは、トランザクション中にディスクをコピーするとトランザクションの整合性が取れなくなってしまうということです。そこでデータの整合性を保つために、DB2からのI/Oを止めてディスクの書き込みの静止点を取る必要があります。

 DB2には、set write suspend/resumeというコマンドが用意されています。このコマンドは、suspendが発行された時点でDB2からディスクへのI/Oを止め、DB2としてI/Oの静止点を取って整合性を保ちます。

 コピー対象となるのは、以下の4つです。

  • データベース・ディレクトリ
  • テーブルスペース・コンテナー
  • ログ・ディレクトリ(アクティブ・ログ、アーカイブ・ログ)

■高速コピー機能によるバックアップ

 差分をコピーするタイプの場合は、事前にデータの再同期を行っておきます。なるべくI/Oサスペンドの状態を短くするためにあらかじめデータを再同期しておくことで、同期を切り離すときだけI/Oをサスペンドさせるのです。

1.データベースのI/Oをサスペンド状態にする

$ db2 connect to sample
 
   データベース接続情報
 
 データベース・サーバ                         = DB2/LINUX 8.1.4
 SQL 許可 ID                                 = DB2INST1
 ローカル・データベース別名                     = SAMPLE
 
$ db2 set write suspend for db
DB20000I  SET WRITE コマンドが正常に終了しました。
実行例

2.syncの実行

 syncコマンドを使うことを推奨するストレージもあるので、必要に応じてsyncを発行します。

3.データの再同期を切断する(もしくはデータの高速コピーを実行)

4.データベースのI/Oを再開

$ db2 set write resume for db
DB20000I  SET WRITE コマンドが正常に終了しました。
$ db2 connect reset
DB20000I  SQL コマンドが正常に終了しました。
実行例

 ここで注意が必要なのは、suspendとresumeは同一コネクションから発行する必要があるということです。簡単なのは、1〜4の一連のコマンドを1つのシェルから実行することです。例えばrootユーザーにsysadm、sysctrl、sysmaintのいずれかの特権を与え、suspendとresumeをrootユーザーで行うのも1つの方法です。

■高速コピー機能におけるリカバリ

 では、リカバリはどうすればよいのでしょうか? コピーで取得した分割ミラーには3つの使用方法があります。

●スナップショット・データベース[snapshot]

 ミラーリングされたデータベースは、バックアップ元のデータベースの複製として、別のサーバで利用可能です。リストア対象は、以下の4つです。

  • データベース・ディレクトリ
  • テーブルスペース・コンテナー
  • ログ・ディレクトリ(アクティブ・ログ、アーカイブ・ログ)

 以下の手順でリストアを行います()。

注:本番で使用しているサーバをプライマリ・サーバ、バックアップ機として待機しているサーバをセカンダリ・サーバとします。


1.ディスク領域のマウント

 バックアップしたディスク領域をセカンダリ・サーバでマウントします。この際、マウントポイントをプライマリ・サーバに合わせます。

2.データベース・マネージャーの開始

$ db2start
01/28/2004 03:31:15     0   0   SQL1063N  DB2START の処理が正常に終了しました。
SQL1063N  DB2START の処理が正常に終了しました。
実行例

3.データベースの初期化

$ db2inidb sample as snapshot
DBT1000I  ツールは正常に完了しました。
実行例

 これで、サスペンドした瞬間のスナップショット・データベースをセカンダリ・サーバで利用できます。

●スタンバイ・データベース[standby]

 ロールフォワード・ペンディング状態にし、アクティブ・ログを適用して極力最新の状態に戻します。リストア対象は、以下の3つです。

  • データベース・ディレクトリ
  • テーブルスペース・コンテナー
  • ログ・ディレクトリ(アーカイブ・ログ)

 以下の手順でリストアを行います。

1.ディスク領域のマウント

 バックアップしたディスク領域をセカンダリ・サーバでマウントします。この際、マウントポイントをプライマリ・サーバに合わせます。

2.データベース・マネージャーの開始

$ db2start
01/28/2004 03:31:15     0   0   SQL1063N  DB2START の処理が正常に終了しました。
SQL1063N  DB2START の処理が正常に終了しました。
実行例

3.データベースの初期化

$ db2inidb sample as standby
DBT1000I  ツールは正常に完了しました。
実行例

4.ロールフォワードの実行

$ db2 rollforward db sample to end of logs
 
                             ロールフォワード状況
 
 入力データベース別名                    = sample
 状況を返したノードの数                  = 1
 
 ノード番号                             = 0
 ロールフォワード状況                    = DB  作業中
 次に読み込むログ・ファイル               = S0000001.LOG
 処理したログ・ファイル                  = S0000000.LOG - S0000000.LOG
 最後にコミットしたトランザクション        = 2004-01-27-18.45.19.000000
 
DB20000I  ROLLFORWARD コマンドが正常に終了しました。
実行例

5.プライマリ・サーバからアーカイブ・ログを転送

6.4〜5を定期的に繰り返す

7.ロールフォワードの終了

 セカンダリ・サーバのデータベースを使用する際に、ロールフォワードを終了します。

$ db2 rollforward db sample complete
 
                             ロールフォワード状況
 
 入力データベース別名                    = sample
 状況を返したノードの数                  = 1
 
 ノード番号                             = 0
 ロールフォワード状況                    = 非ペンディング
 次に読み込むログ・ファイル               =
 処理したログ・ファイル                  = S0000000.LOG - S0000001.LOG
 最後にコミットしたトランザクション        = 2004-01-27-18.45.19.000000
 
DB20000I  ROLLFORWARD コマンドが正常に終了しました。
実行例

 最新のログを適用することで、セカンダリ・サーバでも最新状態のデータを利用できます。

●バックアップ・イメージ[mirror]

 この方式は、バックアップしたディスクイメージをプライマリ・サーバに戻してリストアします。コピーしたイメージをプライマリ・サーバに戻す以外の手順は、スタンバイ・データベースと同じです。

 この方式のリストア対象は、以下の2つです。

  • データベース・ディレクトリ
  • テーブルスペース・コンテナー

 以下の手順でリストアを行います。

1.バックアップしたデータを戻す

2.データベース・マネージャーの開始

$ db2start
01/28/2004 03:31:15     0   0   SQL1063N  DB2START の処理が正常に終了しました。
SQL1063N  DB2START の処理が正常に終了しました。
実行例

3.データベースの初期化

$ db2inidb sample as mirror
DBT1000I  ツールは正常に完了しました。
実行例

4.ロールフォワードの実行と完了

$ db2 rollforward db sample to end of logs and complete
 
                             ロールフォワード状況
 
 入力データベース別名                    = sample
 状況を返したノードの数                  = 1
 
 ノード番号                             = 0
 ロールフォワード状況                    = 非ペンディング
 次に読み込むログ・ファイル               =
 処理したログ・ファイル                  = S0000000.LOG - S0000001.LOG
 最後にコミットしたトランザクション        = 2004-01-27-18.50.42.000000
 
DB20000I  ROLLFORWARD コマンドが正常に終了しました。
実行例

 この方式もスタンバイ・データベースと同様、最新のログを適用することで、セカンダリ・サーバでも最新状態のデータを利用できます。

 以上が、ストレージの高速コピー機能を使ったバックアップ/リストアです。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。