Oracle/백업&복구

백업&복구 14번째(Flashback) ; Table level

에몽이ㅋ 2012. 2. 25. 18:25
Table level 복구(** SYS 소유의 table은 Flashback 사용이 불가능합니다.)
1. DML장애 : undo tablespace이용(undo 가 덮어쓰여지면 복구불가능, redo나 archive를 이용해서 복구해야합니다.)
  --> truncate장애는 database level로만 복구가 가능합니다.(table level로는 불가능) 

2. Drop 장애 : 휴지통이용(지워진 테이블이 실제로 지워지지 않고, BIN$테이블로 이름만 변경됨)
   --> 이후 해당 datafile 은 더이상 빈공간이 없을떄까지는 BIN$테이블을 덮어쓰지 않고, 빈공간부터 사용합니다.

설명



* 명령어
1. SHOW RECYCLEBIN
; 어떤 테이블들이 휴지통에 들어가 있는지 조회
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
RTEST3           BIN$ucc5XjKMZI3gQAB/AQB4lQ==$0 TABLE        2012-02-25:18:08:43


2. FLASHBACK TABLE table_name TO BEFORE DROP;
; 드랍된 테이블 복구
SQL> select * from rtest3;
select * from rtest3
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> flashback table rtest3 to before drop;

Flashback complete.

SQL> select * from rtest3;

        NO
----------
         1
         2


3.
(1)FLASHBACK TABLE table_name TO TIMESTAMP(SYSTIMESTAMP - INTERVAL 'x' MI
NUTE);
; 현재 시간에서 x분 이전으로 table상태를 돌리고 싶을때
(second도 가능  'y' second)
(2)FLASHBACK TABLE table_name TO TIMESTAMP(to_date('rrrr-mm-dd:hh24:mi:ss'));
; 지정된 시간으로 table상태를 돌리고 싶을때 

* undo table을 이용하기 때문에, 돌리고 난 후 아니다 싶으면 시간을 달리해서 계속 복구가 가능합니다.
* 돌리고 난 후라도 interval은 항상 현재 시점을 기준으로 써주셔야 합니다.
(현재에서 1분전으로 돌렸는데 아니다 싶어서 현재에서 2분전으로 돌리고 싶으면 interval '1' minute가 아니고 interval '2' minute입니다.)
* enable row movement 해줘야 합니다.
SQL> select * from rtest3;

        NO
----------
         1
         2

SQL> update rtest3 set no=333;

2 rows updated.

SQL> select * from rtest3;

        NO
----------
       333
       333

SQL> flashback table rtest3 to timestamp(systimestamp - interval '1' minute);
flashback table rtest3 to timestamp(systimestamp - interval '1' minute)
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled


SQL> alter table rtest3 enable row movement;

Table altered.

SQL> flashback table rtest3 to timestamp(systimestamp - interval '1' minute);

Flashback complete.

SQL> select * from rtest3;

        NO
----------
         1
         2


* TABLE level flashback 사용시 주의
1. Foreign key, Reference Key는 살아나지 않습니다. ( http://gyh214.tistory.com/118 참조)
2. timestamp형식으로 되돌릴때, 테이블의 구조가 변경되었다면, 구조가 변경되기 시간 이전으로는 돌아갈 수 없습니다.
3. 휴지통에 해당 테이블이 없다면 복구할 수 없습니다.
4. constraint의 경우 휴지통에 들어가면 constraint이름이 변경되므로 복구후 constraint이름도 다시 변경하세요(인덱스도 마찬가지)
(
http://gyh214.tistory.com/118 )
5. enable row movement 할 떄, 10g의 경우 view가 invalid되므로 view의 경우는 재생성 해주셔야합니다.
(dba_objects(user_objects)의 status로 valid, invalid조회 가능)
결점조사 : select * from user_objects wher status='INVALID';