본문 바로가기
DB/ORACLE

Oracle 오라클 실수로 삭제한 데이터 복구

by 애플 로그 2022. 3. 16.
반응형

Oracle Flashback 기능이란?


DB관리중에 실수로 데이터를 삭제하거나 데이터값을 잘못 변경하는 실수가 가끔 발생 합니다.
이러한 실수는 commit 이전이라면 rollback명령어로 수행한 작업을 원복 시킬수 있지만 기억할수 없는 다수의 컬럼의 수정 및 삭제를 한뒤 commit을 했다면??
이러한 경우에 특정한 시간 또는 특정 시점으로 되돌릴수 있는 기능이 Oracle FlashBack 입니다.

  • dump파일 없이 논리적 장애를 (DML, DDL)을 빠르게 복구
  • 물리적인장애 (파일의손상, 디스크손상) 에 대해서는 복구 불가
  • row level, table level, database level 3개 분류로 나눌수 있음.
  • row level, table level : oracle 에서 기본 권한 사용 가능
  • database level :  system 권한 필요, system down 후 진행

 

FLASHBACK을 사용하기 위한 요구 조건

 1) SHOW PARAMETER UNDO; ( system 계정 ) 

 

NAME            TYPE    VALUE

--------------- ------- --------

undo_management string  AUTO

undo_retention  integer 900

undo_tablespace string  UNDOTBS1

 





2) SELECT * FROM V$VERSION; -- oracle enterprise 버전만 가능 express 버전 X



 

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

 

express에서 사용할 경우 : flashback 기능 사용시 --  ORA-00439: feature not enabled: Flashback Table 에러 발생

PARAMETER UNDO 항목 대한 설명

① UNDO_MANAGEMENT

– 테이타베이스의 Undo 모드를 자동 모드로 사용 할지 수동 모드를 사용할지 여부를 결정 합니다.
– AUTO 또는 MANUAL 값 중 하나로 설정할 수 있으며 초기화 파라미터 파일에서 설정해야 합니다.
– AUTO로 설정하게 되면 데이터베이스는 자동 Undo 관리 모드로 설정되며 undo 테이블스테이스가 필요합니다.
– UNDO_MANAGEMENT = AUTO 로 설정 되어있어야 함
② UNDO_RETENTION
– 일관성 읽기를 위해 제공되는 Undo 데이타의 보유 기간을 결정합니다.
– 초기화 파일에서 설정하거나, ALTER SYSTEM 명령을 사용하여 동적으로 수정할 수 있습니다.
– 이 parameter는 초 단위로 지정됩니다. 기본값은 900초이며, 이는 Undo 데이타를 15분 동안 보유합니다.
※ 설정된 시간 만큼 undo data를 유지 하겠다는 뜻이며, 결국 flash back query는 undo_retention 범위 안에서 유효하다

③ UNDO_TABLESPACE
– 사용할 특정 UNDO 테이블스페이스를 지정 합니다.
– 최소한 하나의 UNDO 테이블 스페이스 생성이 필요 합니다.
– 초기화 파일에서 설정하거나 데이터베이스의 운영중에도 ALTER SYSYTEM 명령을 사용하여 동적으로 변경할 수 있습니다.
–시스템이 관리하는 undo sgment가 만들어질 table space

참고 사이트 : UNDO_RETENTION 설정
 

 


  • FLASHBACK 사용방법


    ( 10g, 11g 기준으로 정리 )

 

1. ROW LEVEL FLASHBACK 


[문제 발생 시나리오]


-- 계정 ynkim 생성 및 로그인

 

create table t_a (

  a  varchar2(10),

  b  varchar2(10)

);

 

insert into t_a(a,b) values('111', '111');

insert into t_a(a,b) values('222', '222');

........

........

 

commit;

 

delete from t_a; 

commit; -- 앗차 지우면안되는데!!

 
 


[복원방법]


    1) AS OF TIMESTAMP 를 이용하여, 시점으로 확인하기
 

 

 


 



SELECT * FROM  YNKIM.T_A AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '10' MINUTE); 



-- 10분전 테이블 데이터 조회

 

SELECT * FROM TEST_TABLE AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);



-- 1일전 테이블 데이터 조회

 

select * from   YNKIM.T_A as of timestamp to_timestamp('20170117163000','yyyyMMdd hh24:mi:ss');



-- 1월 17일 16시30분 데이터 조회 





* t_a의 테이블에 현재는 데이터가 비어있으나, 해당 시점으로 조회 가능. 







-- 10분전 삭제된 데이터를 다시 삽입



INSERT INTO T_A

(SELECT * FROM 

 T_A

 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE)

 )





결과



A    B 

--------

111 111 

222 222 





  • oracle 9i Database Release 2 이상부터는 SELECT... AS OF TIMESTEMP 명령어가 가능 !!
 


2) version query를 사용한 구간 검색

 

commit 내용 검색

 select versions_startscn st_scn, versions_endscn endscn, versions_xid txid, versions_operation opt

 , YNKIM.T_A.*

 from YNKIM.T_A

 versions between scn minvalue and maxvalue; -- opt 에서 D 값 이전 st_scn번호를 확인한다.





조회결과



 ST_SCN     ENDSCN      XID  Opt A B 

---------- ---------- ---------------- 

3815692055 370017008F1E0000 D 222 222 

3815692055 370017008F1E0000 D 111 111 

3815682739 41001500BC160000 I 222 222 

3815682739 41001500BC160000 I 111 111 





- 결과의 의미는 t_a테이블에 A,B 컬럼값에 111,222 가 INSERT 되었다가 DELTE 되었음. 






 


2. Table LEVEL FLASHBACK

 

 

  • 전제조건 : ROW MOVEMENT 가 활성화되어 있어야한다. (자세한 내용은 아래 SCRIPT )

 


  • DML에러가 발생했을때 특정 테이블 전체를 문제 발생전 상태로 FLASHBACK 하는 방법
    1) SCN 으로 DML 복구
    * SCN이란?
    Commit 이 발생하게 되면 LGWR의 해당 트랜젝션은 고유한 번호를 부여받아서 함께 관리 됩니다.
    이렇게 Commit 할 때 생성되는 번호를 오라클은 System Commit Number(SCN)이라고 부릅니다.
     
    
    
    
    1. 위에서 확인한 version query 결과
    
    
    
    조회결과
    
    
    
     ST_SCN     ENDSCN        XID Opt A B 
    
    ---------- ---------- ---------------- 
    
    3815692055 370017008F1E0000 D 222 222 
    
    3815692055 370017008F1E0000 D 111 111 
    
    3815682739 41001500BC160000 I 222 222 
    
    3815682739 41001500BC160000 I 111 111 
    
    
    
    
    
    2. commit SCN 넘버 기준으로 되돌리기
    
    
    
    flashback table T_A to scn '3815682739'; 
    
    
    
    -- delete 이전 st_scn 확인하여 flashback 실행
    
    
    
    
    
    ALTER TABLE YNKIM.T_A ENABLE ROW MOVEMENT; -- 에러 발생시조치 : ORA-08189: 행 이동이 사용으로 설정되지 않았으므로 테이블을 플래시백할 할수없음. 
    
    
    
    
    
    
    
    Flashback을(를) 성공했습니다.
    
    
    
    A    B 
    
    --------
    
    111 111 
    
    222 222 
    
    
    
    

     

    2) 시점으로 테이블 복구
     
    
    
    
    FLASHBACK TABLE T_A TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE); 
    
    -- 10분전으로 되돌리기
    
    
    
    
    
    FLASHBACK TABLE YNKIM.T_A TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
    
    -- 1일전 테이블 데이터 복원
    
     
    
    FLASHBACK TABLE YNKIM.T_A TO timestamp to_timestamp('20170417163000','yyyyMMdd hh24:mi:ss');
    
    -- 4월 17일 16시30분 데이터 복원
    
    
    
    
    
    

    관련 에러 :
    ORA-01466: unable to read data - table definition has changed

    - 시간을 너무 뒤로 돌려서 해당 테이블 또는 commit 정보가 존재하지 않는 시간대를 선택했을시 발생.
 

 

3. Database LEVEL FLASHBACK (sysdba 권한)


전통적인 복구 방식 : 장애 발생시 백업된 데이터파일을 적용시켜 복구

Flashback database 복구 방식 : 장애 난 데이터파일에 Flashback log 라는 것을 바로 적용시켜 복구
필요에 따라 redo log를 사용하기도 함
→ 백업 파일을 복원하는 데 시간이 들지 않기 때문에 훨씬 더 빨리 복구 할수 있다.
: 이 방식으로 복구하는 대표적 장애 - drop user / truncate table 장애

1) 테이블 확인 장애 발생

ynkim > select * from t_a;



A    B 

--------

111 111 

222 222 

 

ynkim > truncate table t_a; <-- 논리적 장애발생



Table T_A이(가) 잘렸습니다.





ynkim > select * from t_a;



선택된 행 없음 





*truncate DDL 명령어로 flashback table 로는 복구 불가




 

2) 복구하기 - 명령어 수행

 





YNKIM> flashback database to timestamp (systeimstamp - interval '5' minute);

에러

ORA-01031: insufficient privileges 

=> 권한에러 : sysdba 권한을 가지고 있어야 한다!!



 

YNKIM> conn / as sysdba;

SYS> flashback database to timestamp (systeimstamp - interval '5' minute);

에러

ORA-38757: Database must be mounted and not open to FLASHBACK.

=> MOUNT 상태에서 수행해야 한다!!

 

 





Flashback database 명령어는 모든 데이터 파일을 불완전 복구처럼 과거 특정시간으로 돌린다.

 → 데이터파일과 리두로그파일, 컨트롤파일의 SCN정보가 다르게 된다.

 

SYS> shutdown imediate;

SYS> startup mount; -- 마운트 상태에서 실행

SYS> flashback database to timestamp (systeimstamp - interval '10' minute);

SYS> alter database open resetlogs; -- database open

SYS> select * from YNKIM.T_A;



복구완료



A    B 

--------

111 111 

222 222

 

 RECYCLEBIN 이란?

  • 사용자마다 할당되며, 다른사용자의 휴지통은 접근할수 없다.
  • 오라클 10g 에서 새로 제공하는 기능으로 Windows 휴지통과 비슷한 개념이다.
  • Object 를 Drop 해도 복구가 가능하다.
  • Drop 된 Object 는 동일한 Tablespace 에 존재한다.
  • Purge 명령으로 완전히 삭제한다.
  • Tablespace 나 User 를 Drop 하게되면 복구되지 않는다.

 


1) Drop tblae 테이블 삭제/복원 시나리오

drop table t_a;







ORIGINAL NAME RECYCLEBIN NAME                OBJECT TYPE   DROP TIME 

------------- ------------------------------ ----------- ------------------- 

T_A           BIN$TQuJMMCAkwfgUAB/AQAx3w==$0 TABLE         2017-04-13:20:30:41 

T_TABLE       BIN$Rm5UzQmTRRHgUAB/AQBw9w==$0 TABLE         2017-01-19:16:17:51  







flashback table YNKIM.T_TABLE to before drop; 

-- 기존 테이블명 t_table 이름으로 복원



flashback table "BIN$RkW5eyI8OrrgUAB/AQAozg==$0" to before drop; 

-- 기존 테이블명 t_table 이름으로 복원 / RECYCLEBIN NAME으로 복원 시





flashback table T_TABLE to before drop rename to T_RENAME; 

-- 테이블 이름을 변경하여 복원.



flashback table "BIN$RkW5eyI8OrrgUAB/AQAozg==$0" to before drop rename to T_RENAME;










2) Recyclebin 의 삭제

drop table t_a purge; -- RecycleBin에 남지 않고 Drop되기 때문에 복원 불가



purge table "BIN$lWD2/r7gQT6hLjW265stXQ==$0"; -- 특정 Table을 지정하여 recyclebin에서 삭제



purge recyclebin; -- recyclebin에 있는 모든 Object들 삭제

 


댓글