본문 바로가기
개발/database

[oracle] 오라클 플래시백 쿼리 flashback query AS OF TIMESTAMP

by 가시죠 2021. 1. 17.
반응형

오라클에서 데이터를 삭제/수정했을 경우, 이전 데이터 조회

 

현재 시간은 SYSDATE, 하루전은 SYSDATE-1

 

한시간전 데이터

SELECT * FROM TABLE_NAME 
AS OF TIMESTAMP(SYSDATE-(1/24));    -- 한시간전 데이터 조회

 

10분 전 데이터

SELECT * FROM TABLE_NAME 
AS OF TIMESTAMP(SYSDATE-(1/24)/6);    -- 10분 전 데이터 조회

 

1분 전 데이터

SELECT * FROM TABLE_NAME 
AS OF TIMESTAMP(SYSDATE-(1/24)/60);    -- 1분 전 데이터 조회

 

특정 날짜/시간 조회

SELECT * FROM TABLE_NAME
AS OF TIMESTAMP(TO_DATE('20190906140000', 'YYYYMMDDHH24MISS')); -- 2019년 9월 6일 2시 데이터 조회

 


실습 - 운영 혹은 개발 환경에서 특정 테이블의 특정 조건 값을 잘못 삭제 했을 경우 플래시백 쿼리를 이용하여 살려보자

테이블명 : TB_CODE

테이블 생성 스크립트

-- Create table
create table TB_CODE
(
  grp_cd    varchar2(18 CHAR),
  code      varchar2(18 CHAR),
  code_name varchar2(18 CHAR)
)
;

테이블에 데이터 생성

INSERT INTO TB_CODE (GRP_CD, CODE, CODE_NAME) VALUES ('CD01', 'A', '코드A');
INSERT INTO TB_CODE (GRP_CD, CODE, CODE_NAME) VALUES ('CD01', 'B', '코드B');
INSERT INTO TB_CODE (GRP_CD, CODE, CODE_NAME) VALUES ('CD01', 'C', '코드C');

INSERT INTO TB_CODE (GRP_CD, CODE, CODE_NAME) VALUES ('NAT', 'KR', '한국');
INSERT INTO TB_CODE (GRP_CD, CODE, CODE_NAME) VALUES ('NAT', 'CN', '중국');
INSERT INTO TB_CODE (GRP_CD, CODE, CODE_NAME) VALUES ('NAT', 'JP', '일본');

COMMIT;

 

실수로 GRP_CD가 NAT인 코드를 삭제 하고 COMMIT 함.

DELETE FROM TB_CODE CD 
WHERE CD.GRP_CD = 'NAT';

COMMIT;

 

조회해보면 GRP_CD가 'NAT'인 데이터는 삭제되었고, 이미 COMMIT 까지 한 상태라 되돌릴 수 없을때 플래시백 쿼리를 이용하여 조회할 수 있고, 조회한 데이터를 TB_CODE 테이블에 입력.

-- TB_CODE 에 GRP_CD='NAT' 인 데이터가 삭제되었음.
SELECT * FROM TB_CODE;

-- 플래시백 쿼리로 조회 시 삭제된 'NAT' 데이터가 조회됨. (여기서는 1분전으로 함)
SELECT * FROM TB_CODE AS OF TIMESTAMP(SYSDATE-(1/24)/60) WHERE GRP_CD = 'NAT';

-- 조회하여 입력
INSERT INTO TB_CODE
SELECT * FROM TB_CODE AS OF TIMESTAMP(SYSDATE-(1/24/60)) 
WHERE GRP_CD = 'NAT';

-- 데이터를 확인 후 COMMIT;
SELECT * FROM TB_CODE WHERE GRP_CD = 'NAT';
COMMIT;

 

 

 

반응형

댓글