表を間違って消してしまったというときは 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>
消えてしまいました。 バックアップからこのデータを取り戻したいというのが本稿の目的です。
上のような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ではできるだけやりたくないですね。