媒体障害の対応(ARCHIVELOGモード)

バックアップ方針

表領域のバックアップ

ARCHIVELOGモード時に行われるバックアップは、オフライン時の全体バックアップに加え、部分バックアップ(オンライン・オフライン)が使用できる。

具体的なバックアップの手順は以下のようになる:

オフライン部分バックアップ
  1. コマンドALTER TABLESPACE (表領域名) OFFLINEを実行する。その際、以下のようなオプションを指定できる。
    NORMAL
    通常オフライン。全てのチェックポイントを取ってからオフラインを実行する。
    TEMPORARY
    一時オフライン。エラーの起きているファイルのチェックポイント取得はパスする。
    IMMEDIATE
    即時オフライン。チェックポイントを取得せずにオフラインを実行する。
  2. OSコマンドで表領域に属するデータファイルのコピーを行う
  3. コマンドALTER TABLESPACE (表領域名) ONLINEを実行する
オンライン部分バックアップ
  1. コマンドALTER TABLESPACE (表領域名) BEGIN BACKUPを実行する
  2. OSコマンドで表領域に属するデータファイルのコピーを行う
  3. コマンドALTER TABLESPACE (表領域名) END BACKUPを実行する

これらのコマンドを実行するためには、MANAGE TABLESPACEシステム権限が必要となる。

ある表領域に含まれるデータファイルのリストは、以下のコマンドで確認できる:

SELECT tablespace_name, file_name
   FROM sys.dba_data_files
   WHERE tablespace_name = '(表領域名)';

オンラインバックアップを行った場合、終了させることを忘れたままデータベースを使用しつづけると、そのうち異常停止する。その他の原因でオンラインバックアップ中にデータベースが異常停止した場合、回復処理が必要になる。
具体的には、オフライン状態でALTER DATABASE DATAFILE (データファイル名) END BACKUPコマンドを発行して表領域をバックアップ終了状態にした後、再度オープンする。オンライン・データ・ファイルのバックアップ状況は、動的パフォーマンス表v$backupから確認することができ、その具体的な問い合わせ構文は

SELECT name, bu.status
  FROM v$datafile df, v$backup bu
  WHERE df.file# = bu.file#;

のようになる。

制御ファイルのバックアップ

表領域の部分バックアップを使用する場合、データベースの構造を変更したタイミングで、制御ファイルのバックアップを取得する必要がある。

制御ファイルのバックアップには、以下の2つの方法がある:

ALTER DATABASE BACKUP CONTROLFILE TO '(バックアップファイル名)' REUSE
制御ファイルの物理バックアップを作成する。REUSEパラメータは上書きのために必要
ALTER DATABASE BACKUP CONTROLFILE TO TRACE RESETLOGS;
現在の制御ファイルと同じものを作成するSQL文をトレースファイルに書き出す。

リカバリ方針

基本方針

ARCHIVELOGモードでの運用を行っている場合、REDOログファイルを適用することによって、柔軟な回復処理を行うことができる。REDOログファイルにより、

という各レベルの回復を行うことができるし、障害直前までの回復(完全回復)だけでなく、特定の時間やSCNを指定した不完全回復も行うことができる。

なお、これらのコマンドはServer Managerのものであり、SQLからアクセスする場合にはALTER DATABASE RECOVER 〜という構文を使用する。但し、Server Managerを使用した場合、プロンプトによって入力支援を得られるので、独自アプリを作りこむので無ければServer Managerを使用する。

ログファイルの適用方法

すべてのアーカイブ済みログと回復に必要なログは、それぞれ動的パフォーマンス表v$log_historyv$recovery_logからアクセスすることができる。
ここで指定された必要なログファイルは、すべて初期化パラメータLOG_ARCHIVE_DESTの示す場所にコピーする。ディスク容量などの関係でそこに配置できない場合、次のような方法で配置した場所を指定する:

Server Manager
SET LOGSOURCE 〜コマンドで変数をセット
SQL
ALTER DATABASE RECOVER 〜 FROM 〜で文中に直接指定

これらの場所に必要なログファイルが全て存在している場合、以下の指定をすることでREDOログファイルを自動的に適用していくことができる:

Server Manager
SET AUTORECOVERY ONコマンドで変数をセットするか、ログ名を求められたときに「auto」を入力する
SQL
ALTER DATABASE RECOVER AUTOMATIC 〜とする

そして、UNTIL CANCEL句が指定されていない場合、ログファイル名の入力を求められたとき、「cancel」と入力すると、回復作業を中断できる。回復を再始動することで、回復作業を再開できる。

また、このコマンドを発行してから回復セッションを終了するまでの間は、回復セッションの処理状況とファイルごとの状態を、動的パフォーマンス表v$recovery_statusv$recovery_file_statusから得ることができる

リカバリ作業に必要な前提

リカバリ作業のためには以下の前提が満たされていなければならない、と「SQL言語リファレンス」には書いてある。

リカバリ作業内容

多重化ファイル(制御ファイル・REDOログファイル)の部分破損

NOARCHIVELOGモードと同じ。

制御ファイルの完全破損

NOARCHIVELOGモードでの手法に加え、制御ファイルの物理バックアップがある場合には、USING BACKUP CONTROLLFILE句を指定したRECOVER DATABASEコマンドを用いての回復を行うことができる。

  1. データベースを強制終了する
  2. インスタンスをNOMOUNTモードで起動する
  3. RECOVER DATABASE USING BACKUP CONTROLLFILEコマンドを実行する
  4. データベースをRESETLOGSオプション付きでオープンする
  5. この時点で媒体回復を行えなくなるので、いったんデータベースをクローズし、全体バックアップを取りなおすことが望ましい。

読み込み専用表領域の破損

NOARCHIVELOGモードと同じ。

一時表領域の破損

NOARCHIVELOGモードと同じ。

カレントREDOロググループの破損

ARCHIVELOGモードでは、破損したREDOログファイルが使用されていた直前までの状態にデータベースを回復することができる。その手順は以下の通り:

データファイルの破損(オフライン回復)

ARCHIVELOGモードでは、破損したデータファイルが使用されていた直前までの状態にデータベースを回復することができる。その手順は以下の通り:

回復を必要としているファイルとその状態は、動的パフォーマンス表v$recover_fileから取得できる。その使用例は以下の通りである:

SELECT name, online, error
    FROM v$recover_file rf, v$datafile df
    WHERE rf.file# = df.file#;

データファイルの破損(オンライン回復)

ARCHIVELOGモードでは、上記の他に、障害を起こした表領域がSYSTEMまたはロールバック領域で無い場合に、他の領域をオンラインにしたままの回復を行うことができる。その手順は以下の通り:

または、表領域ではなくデータファイルを対象に回復を行うことができる。

未バックアップデータファイルの破損

新たに作成されたデータファイルがバックアップする前に破損したとしても、作成から後のREDOログファイルが全て残っている場合には、空のデータファイルを作成してからREDOログファイルを適用していくことで回復を行うことができる。

ポイントタイムリカバリ

ARCHIVELOGモードでは、ユーザーエラーなどにより、データベースの状態を過去の特定の時点に戻したいとき、一貫性を保ったままでそれを行うことができる。具体的には、その時点より以前のバックアップファイルを設定し、特定の時点までの(不完全)回復を行うのである。過去の特定の時点は、時刻またはSCNにて指定することができる。その手順は以下の通り: