반응형
Oracle FLASHBACK 에 대해 알아보자(데이터복원)
DB 조작중 데이터를 실수로 삭제하거나 데이터값을 잘못 변경하는 실수가 가끔 발생을 한다
이러한 오류를 바로 인식할 경우는 rollback이라는 명령으로 복구하지만,
commit을 한 이후 시점이나, 한참시간이 지난후에 알았다면 아주 난감할수 있다.ㅠ_ㅠ
이러한 경우 특정한 시간 또는 시점으로 되돌릴수 있는 기능이 Oracle Flashback 입니다.
FLASHBACK 을 사용하기위한 요구조건
SHOW PARAMETER UNDO;
UNDO_MANAGEMENT = AUTO 로 설정되어있으야 합니다.
SELECT * FROM V$VERSION; -- oracle enterprise 버전만 가능 express 버전 X
-- flashback 사용시 -- ORA-00439: feature not enabled: Flashback Table 에러 발생
1. DELETE 데이터 복원 시나리오 / ROW LEVEL FLASHBACK
1) commit SCN 넘버 확인 하기
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 TXID Opt A B
---------- ---------- ---------------- - ---------- ----------
3815692055 370017008F1E0000 D 222 222
3815692055 370017008F1E0000 D 111 111
3815682739 41001500BC160000 I 222 222
3815682739 41001500BC160000 I 111 111
조회내용에서 opt컬럼을 보면 INSERT, DELETE를 한것을 확인할수 있다.
INSERT 당시의 데이터로 복원을 할 경우 st_scn 을 확인 한다..
2) 시점으로 확인하기
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 EER_YNKIM.T_A
as of timestamp to_timestamp('20170117163000','yyyyMMdd hh24:mi:ss');
-- 1월 17일 16시30분 데이터 조회
위 단계에서 적은 데이터 또는 ROW 단위의 복원이라면,
데이터 확인후 수동으로 update, insert 쿼리를 작성하여 원복이 가능하겠다.
TABLE FLASHBACK 실행
1) commit SCN 넘버 기준으로 되돌리기
flashback table YNKIM.T_A to scn '3815569377';
-- delete 이전 st_scn 확인하여 flashback 실행
ALTER TABLE YNKIM.T_A ENABLE ROW MOVEMENT; -- 에러 발생시조치 : ORA-08189: 행 이동이 사용으로 설정되지 않았으므로 테이블을 플래시백할 할수없음.
2) 시점으로 되돌리기
FLASHBACK TABLE YNKIM.T_A TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE); -- 10분전으로 되돌리기
3) backup table 생성을 통한 복구
create table [신규테이블명] as
select * from [테이블명]
as of timestamp to_timestamp('[삭제 및 수정 시간]','yyyyMMdd hh24:mi:ss')
2. DROP 테이블 복원 시나리오 - 사용자계정에서 가능
create table t_table
(
aa varchar2(20),
bb varchar2(20)
);
declare
i_cnt number := 0;
begin
for i_cnt in 1 .. 5000 loop
insert into t_table(aa,bb) values('테스트'||i_cnt,'안녕'||i_cnt);
end loop;
end;
commit;
drop table t_table; -- 앗, 테이블 지우면 안되는데..
show recyclebin; -- 휴지통 확인
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
------------- ------------------------------ ----------- -------------------
T_TABLE BIN$RkW5eyI7OrrgUAB/AQAozg==$0 TABLE 2017-01-17:15:55:34
select * from t_table;
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.
망했다..
테이블 복원
-- 기존 테이블명으로 복원
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; -- t_rename으로 복원
flashback table "BIN$RkW5eyI8OrrgUAB/AQAozg==$0" to before drop rename to T_RENAME;
Recyblebin 삭제
drop table t_table; -- recyblebin에 남기지 않고 삭제
purge table "[recyble name]"; -- recyclebin에서 삭제
'DB > ORACLE' 카테고리의 다른 글
Oracle 계정 생성 및 사용자 권한 관리 (0) | 2023.05.12 |
---|---|
oracle 19c 다운로드 쉽게 설명 (0) | 2023.04.27 |
oracle 10g 재기동 방법 정리 (0) | 2022.08.31 |
오라클 테이블스페이스 사용량 조회 (0) | 2022.08.23 |
Oracle 1000만건 테이블 INSERT LOOP 쿼리 (0) | 2022.07.12 |
댓글