Oracleでバックアップ準備からリカバリアドバイザーとフラッシュバックでリカバリする手順を紹介する

覚えるべきキーワード

・list backup
・CROSSCHECK BACKUP
・DELETE EXPIRED BACKUP
・DELETE OBSOLETE
・CHANGE UNAVAILABLE
・CATALOG
・LIST FAILURE
・ADVISE FAILURE
・REPAIR FAILURE
・ALTER TABLE テーブル名ENABLE ROW MOVEMENT
・FLACKBACK TABLE 表名 TO TIMESTAMP 時刻
・FLASKBACK TABLE テーブル名 TO BEFORE DROP

Oracleでリカバリを実行するためにはまずバックアップデータの適切な準備が必要です。バックアップデータが不十分だとリカバリができませんので。

リカバリ実行のためにバックアップの準備をする

バックアップファイルの情報はRMANリポジトリに登録されています。リカバリを実行する時はRMANリポジトリの情報を見に行きます。そのため、まずはRMANリポジトリ登録情報がバックアップ可能なステータスになっているかを確認する必要があります。

①RMANに接続します

export ORACLE_SID = インスタンス名;

ORACLE_SIDを指定します。

rman target “’ / as sysbackup’”;

SYSBACKUPで接続します。

②list backup(またはlist copy)を実行します

list backup;

RMANに接続した状態でlist backupを実行します。バックアップステータスが表示されるので確認します。ここでステータス項目にAVAILABLEと表示されれば、リカバリの準備は整いますが、EXPIREDとUNAVAILABLEと表示されれば、リカバリ実行はできないため、対策が必要です。
バックアップのステータスはAVALABLE、EXPIRED、UNAVAILABLEの3つがあります。

図:バックアップのステータス

ステータス 説明
AVAILABLE バックアップが使用可能な状態。RMANリポジトリに登録されているバックアップがディスクもしくはテープに存在し、利用できることを意味している。AVAILABLEの時のみバックアップが実行できる
EXPIRED 期限切れ。RMANリポジトリにはバックアップ情報が登録されているが、ディスクやテープにはバックアップが存在していない。バックアップは実行できない
UNAVAILABLE 使用不可。外部に保管されているテープやマウントされていないディスクにバックアップが存在している。バックアップは実行できない

ステータスがEXPIREDやUNAVAILABLEの場合はリカバリが実行できないため、正しいディレクトリにバックアップファイルを置いてください。しかし、置いただけではRMANリポジトリのステータスはそのままです。
その後にクロスチェックコマンドを実行して、はじめてステータスがAVAILABLEに変わります。クロスチェックで物理的なバックアップの状態とRMANリポジトリに格納されているバックアップ情報が一致しているかをチェックします。
CROSSCHECK BACKUPコマンドでそのチェックができます。

CROSSCHECK BACKUP;

物理的なバックアップの状態とRMANリポジトリに格納されているバックアップ情報が一致すれば、AVAILABLEに変わります。

RMANにはCROSSCHECK意外にもバックアップファイルをメンテナンスするコマンドがいくつか用意されています。細かくは触れませんが、代表的なコマンドは以下です。

(期限切れバックアップの削除)
DELETE EXPIRED BACKUP:EXPIRED(期限切れ)のバックアップをすべて削除します。

(不要なバックアップの削除)
DELETE OBSOLETE:不要なバックアップを削除します。高速リカバリ領域を指定しているなら、不要なバックアップは自動削除されるので、手動削除は必要ありません。

(OSコマンドで取得したバックアップのカタログ化)
CATAROG:RMANリポジトリに未登録なバックアップやOSコマンドによって取得されたバックアップはそのままだとRMANを用いたリカバリが実行できないため、CATALOGコマンドを実行し、RMANリポジトリに登録(カタログ化)する必要があります。

リカバリの実行

リカバリにはデータリカバリアドバイザを使うリカバリフラッシュバック機能を使うリカバリがあります。

データリカバリアドバイザを使うリカバリはOracle社が推奨しているリカバリ方法です。RMANのコマンド操作により簡単にリカバリができます。

データリカバリアドバイザでリカバリする手順

データリカバリアドバイザのリカバリ方法を順番に紹介します。

①RMANでデータベースに接続する

export ORACLE_SID = インスタンス名;

ORACLE_SIDを指定します。

rman target “’ / as sysbackup’”;

SYSDBAで接続します。

②RMANでLIST FAILUREの実行

LIST FAILURE;

発生しているすべての障害の説明が表示されるので、確認します。

③RMANでADVISE FAILUREの実行

ADVISE FAILURE;

自動と手動の修復オプションを表示します。データリカバリアドバイザが最適なリカバリ方法を提案してくれます。
(例えば、○○バックアップファイルをリストアして、リカバリします。など)

④RMANでREPAIRE FAILUREの実行

REPAIRE FAILURE;

REPAIRE FAILUREコマンドによってADVISE FAILUREで表示された修復オプションの内容を実行します。バックアップは自動的にリストアされ、リカバリが実行されます。

これでリカバリは完了です。

①RMANでデータベースに接続する②RMANでLIST FAILUREの実行③RMANでADVISE FAILUREの実行④RMANでREPAIRE FAILUREの実行、の4ステップです。

フラッシュバック機能でリカバリする手順

フラッシュバック機能でリカバリする方法もあります。フラッシュバック機能の中でフラッシュバック表とフラッシュバックドロップを紹介します。

<1.フラッシュバック表のリカバリ>

フラッシュバック表はバックアップをリストアせず、過去のある時点にさかのぼってデータをリカバリする機能です。バックアップデータを使用する代わりにUNDO表領域のデータを使用します。また、ユーザーは以下のシステム権限とオブジェクト権限が必要です。

図:フラッシュバック表の実行に必要な権限

ステータス 説明
種類 フラッシュバック表の実行に必要な権限
システム権限 FLASHBACK TABLE、もしくはFLASHBACK ANY TABLE
オブジェクト権限 SELECT、INSERT、DELETE、ALTER

①権限の確認

まずはユーザー権限を確認してください。

select * from user_sys_privs;  ※システム権限
select * from user_tab_privs;  ※オブジェクト権限

②事前データ取得

emp表が今回のフラッシュバック表の対象表だったとしましょう。まずは事前データを取得します。(事前、事後でデータを比べるため)
エクセルファイルに貼っとくといいですね。(※エクセルシートは文字列にしておく)

select * from emp;

③行移動の有効化

これは個人的に理解できていないので深い説明ができませんが、対象の表に対して行移動を有効にするSQLのようです。emp表が今回のフラッシュバック表の対象表だったとしましょう。

ALTER TABLE emp ENABLE ROW MOVEMENT;

④FLACKBACK TABLE 表名 TO TIMESTAMP 時刻を実行する
戻したい時刻を指定して、リカバリを行います。

FLASHBACL TABLE emp TO TIMESTAMP TO_TIMESTAMP(‘2018-02-18 16:00:00’,’YYYY-MM-DD HH24:MI:SS’);

2018年2月18日の16時ちょうど時点のデータに戻しました。

⑤事後データ取得

select * from emp;

②で実行したselect文を再実行し、表示データを比較します。比較することでフラッシュバックアップ表が成功したかどうかが分かります。

<2.フラッシュバックドロップのリカバリ>

フラッシュバックドロップは表の削除を無効にして、元に戻す機能です。
DROP TABLEはDDLなので、実行するだけでcommitせずとも処理が確定してしまいますが、フラッシュバックドロップを実行すればうっかり削除してしまった表も復活させることができます。
(※ただし、purge句を付けて、DROP TABLEを実行していたら復活させられません)

削除してしまった表がemp表と仮定して手順を紹介します。

①ゴミ箱から削除した表の名前を取得する

SHOW RECYCLEBIN;

削除した表がゴミ箱にあるかを確認します。ここになければ、元に戻せません。

②FLASKBACK TABLE テーブル名 TO BEFORE DROP;

FLASKBACK TABLE emp TO BEFORE DROP;

フラッシュバックドロップを実行します。

③事後データ確認

select * from emp;

これでデータが取得できれば、OKです。表は復活しています。