----
*はじめに [#k4420b78]

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

-Edition の比較 http://www.oracle.co.jp/database/packaging.html

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

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

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

ここでは 10gR1 で実験していますが、10gR2 でも同様です。
ここでは 10gR1 で実験していますが、10gR2 でも同様になります。
* データを消してみる [#c0c69790]

 [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で不完全リカバリ [#jf7c7d6f]

上のような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が完了しました。

* 間違った時点に戻してしまったときは [#kf05951e]

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にリセットされました

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

* 戻っていることを確認 [#wa2775b0]

無事回復しています。

 [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> 

* 補足 [#ef5aac38]

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

 SQL> select CHECKPOINT_CHANGE# from v$database;
 
 CHECKPOINT_CHANGE#
 ------------------
             492039

* 終わりに [#a7aa3d42]

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

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

----
#comment

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS