媒体障害の対応(ARCHIVELOGモード)
バックアップ方針
表領域のバックアップ
ARCHIVELOGモード時に行われるバックアップは、オフライン時の全体バックアップに加え、部分バックアップ(オンライン・オフライン)が使用できる。
具体的なバックアップの手順は以下のようになる:
- オフライン部分バックアップ
-
- コマンドALTER TABLESPACE (表領域名) OFFLINEを実行する。その際、以下のようなオプションを指定できる。
- NORMAL
- 通常オフライン。全てのチェックポイントを取ってからオフラインを実行する。
- TEMPORARY
- 一時オフライン。エラーの起きているファイルのチェックポイント取得はパスする。
- IMMEDIATE
- 即時オフライン。チェックポイントを取得せずにオフラインを実行する。
- OSコマンドで表領域に属するデータファイルのコピーを行う
- コマンドALTER TABLESPACE (表領域名) ONLINEを実行する
- オンライン部分バックアップ
-
- コマンドALTER TABLESPACE (表領域名) BEGIN BACKUPを実行する
- OSコマンドで表領域に属するデータファイルのコピーを行う
- コマンド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ログファイルにより、
- データベース全体(RECOVER DATABASE)
- 特定の表領域(RECOVER TABLESPACE)
- 特定のデータファイル(RECOVER DATAFILE)
という各レベルの回復を行うことができるし、障害直前までの回復(完全回復)だけでなく、特定の時間やSCNを指定した不完全回復も行うことができる。
なお、これらのコマンドはServer Managerのものであり、SQLからアクセスする場合にはALTER DATABASE RECOVER 〜という構文を使用する。但し、Server Managerを使用した場合、プロンプトによって入力支援を得られるので、独自アプリを作りこむので無ければServer Managerを使用する。
ログファイルの適用方法
すべてのアーカイブ済みログと回復に必要なログは、それぞれ動的パフォーマンス表v$log_history・v$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_statusとv$recovery_file_statusから得ることができる
リカバリ作業に必要な前提
リカバリ作業のためには以下の前提が満たされていなければならない、と「SQL言語リファレンス」には書いてある。
- OSDBAロールを使用可能にしなければならない(不完全回復でなければOSOPERロールで実行できる、と「管理者ガイド」には書いてある)。
- データベースは排他モードでマウントされていなければならない(パラレルモードであってはならない)
- マルチ・スレッド・サーバで接続していてはならない
リカバリ作業内容
多重化ファイル(制御ファイル・REDOログファイル)の部分破損
NOARCHIVELOGモードと同じ。
制御ファイルの完全破損
NOARCHIVELOGモードでの手法に加え、制御ファイルの物理バックアップがある場合には、USING BACKUP CONTROLLFILE句を指定したRECOVER DATABASEコマンドを用いての回復を行うことができる。
- データベースを強制終了する
- インスタンスをNOMOUNTモードで起動する
- RECOVER DATABASE USING BACKUP CONTROLLFILEコマンドを実行する
- データベースをRESETLOGSオプション付きでオープンする
- この時点で媒体回復を行えなくなるので、いったんデータベースをクローズし、全体バックアップを取りなおすことが望ましい。
読み込み専用表領域の破損
NOARCHIVELOGモードと同じ。
一時表領域の破損
NOARCHIVELOGモードと同じ。
カレントREDOロググループの破損
ARCHIVELOGモードでは、破損したREDOログファイルが使用されていた直前までの状態にデータベースを回復することができる。その手順は以下の通り:
- データベースを強制終了する
- データファイルと制御ファイルをバックアップからコピーする
- インスタンスをMOUNTモードで起動する
- RECOVER DATABASE UNTIL CANCELコマンドを実行する
- 破損したREDOログファイルの直前まで、REDOログファイルを適用していく
- 破損したREDOファイルのところで、CANCELを入力して回復を取り消す
- データベースをRESETLOGSオプション付きでオープンする
- この時点で媒体回復を行えなくなるので、いったんデータベースをクローズし、全体バックアップを取りなおすことが望ましい。
データファイルの破損(オフライン回復)
ARCHIVELOGモードでは、破損したデータファイルが使用されていた直前までの状態にデータベースを回復することができる。その手順は以下の通り:
- データベースを強制終了する
- 障害を起こしたデータファイルをバックアップからコピーする
- インスタンスをMOUNTモードで起動する
- RECOVER DATABASEコマンドを実行する
- 使用される全てのREDOログファイルを適用していく
- データベースをオープンする
回復を必要としているファイルとその状態は、動的パフォーマンス表v$recover_fileから取得できる。その使用例は以下の通りである:
SELECT name, online, error
FROM v$recover_file rf, v$datafile df
WHERE rf.file# = df.file#;
データファイルの破損(オンライン回復)
ARCHIVELOGモードでは、上記の他に、障害を起こした表領域がSYSTEMまたはロールバック領域で無い場合に、他の領域をオンラインにしたままの回復を行うことができる。その手順は以下の通り:
- 障害を起こした表領域をオフラインにする(ALTER TABLESPACE (表領域) OFFLINE IMMEDIATE)
- 障害を起こしたデータファイルをバックアップからコピーする
- RECOVER TABLESPACE (表領域名)コマンドを実行する
- 使用される全てのREDOログファイルを適用していく
- 表領域をオンラインにする。
または、表領域ではなくデータファイルを対象に回復を行うことができる。
- 障害を起こしたデータファイルをオフラインにする(ALTER DATABASE DATAFILE (データファイル名) OFFLINE)
- 障害を起こしたデータファイルをバックアップからコピーする
- RECOVER DATAFILE (データファイル名)コマンドを実行する
- 使用される全てのREDOログファイルを適用していく
- データファイルをオンラインにする
未バックアップデータファイルの破損
新たに作成されたデータファイルがバックアップする前に破損したとしても、作成から後のREDOログファイルが全て残っている場合には、空のデータファイルを作成してからREDOログファイルを適用していくことで回復を行うことができる。
- 障害を起こしたデータファイルを新規に作成する(ALTER DATABASE CREATE DATAFILE (データファイル名))
- RECOVER TABLESPACE (データファイル名)コマンドを実行する
- 使用される全てのREDOログファイルを適用していく
- データファイルをオンラインにする
ポイントタイムリカバリ
ARCHIVELOGモードでは、ユーザーエラーなどにより、データベースの状態を過去の特定の時点に戻したいとき、一貫性を保ったままでそれを行うことができる。具体的には、その時点より以前のバックアップファイルを設定し、特定の時点までの(不完全)回復を行うのである。過去の特定の時点は、時刻またはSCNにて指定することができる。その手順は以下の通り:
- データベースを強制終了する
- データファイルと制御ファイルをバックアップからコピーする
- インスタンスをMOUNTモードで起動する
- RECOVER DATABASE UNTIL TIME (時刻)コマンド、またはRECOVER DATABASE UNTIL CHANGE (SCN)を実行する
- 対象となる時点に相当するところまで、REDOログファイルを適用していく
- データベースをRESETLOGSオプション付きでオープンする
- この時点で媒体回復を行えなくなるので、いったんデータベースをクローズし、全体バックアップを取りなおすことが望ましい。