はじめに

表を間違って消してしまったというときは 10g Enterprise Edition だと FLASHBACK TABLE などが使えますが、 10g Standard Edition 以下では FLASHBACK QUERY しか使えません。

バックアップが取ってあれば、不完全リカバリでそのときの状態に戻せます。

また、時刻を指定するためのフォーマットを決めておく必要があります。

[oracle@ml110 ~]$ export NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS'

ここでは 10gR1 で実験していますが、10gR2 でも同様になります。

データを消してみる

[oracle@ml110 ~]$ sqlplus scott/tiger

SQL*Plus: Release 10.1.0.3.0 - Production on 日 5月 7 20:47:46 2006

Copyright (c) 1982, 2004, Oracle.  All rights reserved.



Oracle Database 10g Release 10.1.0.3.0 - Production
に接続されました。
SQL> select * from SALGRADE;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999

SQL> delete from SALGRADE;

5行が削除されました。

SQL> commit;

コミットが完了しました。

SQL> select * from SALGRADE;

レコードが選択されませんでした。

SQL> 

消えてしまいました。 バックアップからこのデータを取り戻したいというのが本稿の目的です。

RMANで不完全リカバリ

上のような5行を失っただけということでは簡単でしょうが、 壊れた規模が大きいときには、不完全リカバリすることになります。 一度DBを止めることになってしまいますが、任意の時点に戻れます。

ここでは 2006/05/07 20:50:00 の時点に戻したい、ということにしましょう。

まずは DB を止めて、MOUNT で再起動しておきます。

[oracle@ml110 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.1.0.3.0 - Production on 日 5月 7 21:22:44 2006

Copyright (c) 1982, 2004, Oracle.  All rights reserved.



Oracle Database 10g Release 10.1.0.3.0 - Production
に接続されました。
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount
ORACLEインスタンスが起動しました。

Total System Global Area  285212672 bytes
Fixed Size                   778776 bytes
Variable Size              95428072 bytes
Database Buffers          188743680 bytes
Redo Buffers                 262144 bytes
データベースがマウントされました。
SQL> quit
Oracle Database 10g Release 10.1.0.3.0 - Productionとの接続が切断されました。

RMAN で接続して、不完全リカバリします。

[oracle@ml110 ~]$ rman target sys/xxxxxxxx

Recovery Manager: Release 10.1.0.3.0 - Production

Copyright (c) 1995, 2004, Oracle.  All rights reserved.

ターゲット・データベース: ORCL (データベースID=1117451453)に接続されました

RMAN> run {
2> set until time='2006-05-07:20:50:00';
3> restore database;
4> recover database;
5> }

実行コマンド: SET until clause

restoreが開始されました(開始場所: 2006-05-07:21:43:11)
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: sid=160 devtype=DISK
...
restoreが完了しました(完了場所: 2006-05-07:21:44:19)

recoverが開始されました(開始場所: 2006-05-07:21:44:20)
チャネルORA_DISK_1の使用

メディア・リカバリを開始しています
...
アーカイブ・ログ・ファイル名=/home/oracle/app/oracle/flash_recovery_area/ORCL/archivelog/
2006_05_07/o1_mf_1_22_25vtfxtw_.arc スレッド=1 順序=22
メディア・リカバリが完了しました
recoverが完了しました(完了場所: 2006-05-07:21:45:40)

RMAN>

ちゃんと終わったことを確認して、open resetlogs で DB を開始します。

RMAN> alter database open resetlogs;

データベースがオープンしました。

RMAN> quit


Recovery Managerが完了しました。

間違った時点に戻してしまったときは

open resetlogs した後で、実は戻す時刻を間違えた ということに気がついたときは、incarnation をリセットすることになります。 DB は予め MOUNT 状態にしておきます。OPEN ではエラーになります。

list incarnation of database で incarnation のリストが取れます。

[oracle@ml110 ~]$ rman target sys/xxxxxxxx

Recovery Manager: Release 10.1.0.3.0 - Production

Copyright (c) 1995, 2004, Oracle.  All rights reserved.

ターゲット・データベース: ORCL (データベースID=1117451453)に接続されました

RMAN> list incarnation of database;

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています

データベース・インカネーション・リスト
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1117451453       PARENT  1          2004-08-10:18:27:45
2       2       ORCL     1117451453       PARENT  366852     2006-05-05:21:25:19
4       4       ORCL     1117451453       PARENT  404652     2006-05-06:00:43:16
3       3       ORCL     1117451453       ORPHAN  406004     2006-05-05:23:38:59
6       6       ORCL     1117451453       CURRENT 529435     2006-05-07:21:46:10
5       5       ORCL     1117451453       ORPHAN  529851     2006-05-07:21:36:13

RMAN> 

reset database to incarnation で戻します。

RMAN> reset database to incarnation 4; 

データベースがインカネーション4にリセットされました

成功したら、また上のように不完全リカバリにチャレンジしましょう。

戻っていることを確認

無事回復しています。

[oracle@ml110 ~]$ sqlplus scott/tiger

SQL*Plus: Release 10.1.0.3.0 - Production on 日 5月 7 21:55:07 2006

Copyright (c) 1982, 2004, Oracle.  All rights reserved.



Oracle Database 10g Release 10.1.0.3.0 - Production
に接続されました。
SQL> select * from SALGRADE;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999

SQL> 

補足

現在の SCN は v$database から取れます。 時刻がわからなくて SCN がわかるということはあまりないかもしれませんが、 どちらかがわかっていれば大丈夫です。

SQL> select CHECKPOINT_CHANGE# from v$database;

CHECKPOINT_CHANGE#
------------------
            492039

終わりに

incarnation(インカーネーション)というのは、 REDO ログの履歴のたどり方の枝です。 CVS で言うブランチタグと同じように考えればいいでしょう。

incarnation を reset できるとは言え、 alter database open resetlogs するのは緊張します。 本番DBではできるだけやりたくないですね。



トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-09 (月) 17:21:23