728x90
반응형
TIMESTAMP
데이터베이스를 이용하다 보면 실수로 데이터를 삭제하거나 잘못 업데이트하는 경우가 있다.
물론 COMMIT을 하기 전이라면 상관이 없다. ROLLBACK을 하면 그만. 하지만 COMMIT을 한 이후에 문제를 확인하여 데이터를 복구해야 하는 경우가 있다.
이럴 때 ORACLE의 TIMESTAMP를 이용하면 데이터를 복구할 수 있다.
TIMESTAMP의 사용 조건
1) oracle 9i 이상부터 지원
2) DB 설정된 시간에 따라 오래 지난 데이터는 TIMESTAMP로 복구가 불가능함
TIMESTAMP 사용법
단위는 SECOND, MINUTE, HOUR, DAY로 지정해서 사용할 수 있다. 기준은 현재 시점이고 조건문을 함께 사용하는 것이 좋다.
-- 10초 전의 데이터 조회
SELECT * FROM 테이블 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' SECOND)
WHERE 컬럼 = '조건 내용'; -- 조건문 사용 가능
-- 10분 전의 데이터 조회
SELECT * FROM 테이블 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE)
-- 5시간 전의 데이터 조회
SELECT * FROM 테이블 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '5' HOUR)
-- 3일 전의 데이터 조회
SELECT * FROM 테이블 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '3' DAY)
-- 특정 시간 기준으로 데이터 조회
SELECT * FROM USER_TB AS OF TIMESTAMP(TO_DATE('20230317 11:30:00', 'YYYYMMDD HH24:MI:SS'));
TIMESTAMP로 데이터 쉽게 비교하기
어떤 데이터가 변경되었는지 확인하려는 경우 아래와 같이 현재 데이터와 과거 데이터를 UNION ALL로 묶어 보면 비교하기 편하다.
-- TIMESTAMP로 현재 데이터와 10분 전 데이터 비교
SELECT * FROM 테이블 WHERE 컬럼 = '조건 내용'
UNION ALL
SELECT * FROM 테이블 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL 10 MINUTE) WHERE 컬럼 = '조건 내용';
TIMESTAMP로 특정 시점의 데이터 생성 및 수정
이제 어떤 데이터가 지워졌는지/바뀌었는지까지는 확인했다. 이제 원래대로 되돌려 놓을 차례. 삭제/변경된 데이터를 하나하나 집어넣을 수는 없으니 TIMESTAMP SELECT INSERT, TIMESTAMP SELECT UPDATE를 이용해 보자.
-- 10분전 데이터 조회 TIMESTAMP SELECT INSERT 방식
INSERT INTO 테이블
SELECT * FROM 테이블 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL 10 MINUTE) WHERE 컬럼 = '조건 내용';
-- 10분전 데이터 조회 TIMESTAMP SELECT UPDATE 방식
UPDATE 테이블 A
SET A.변경컬럼 = (SELECT B.변경컬럼 FROM 테이블 B AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL 10 MINUTE)
WHERE A.조건컬럼= B.조건컬럼
AND B.조건컬럼 = '조건 내용')
WHERE A.조건컬럼 = '조건 내용';
728x90
반응형
'Database > SQL' 카테고리의 다른 글
[Oracle] ORA-12899: 열에 대한 값이 너무 큼 (1) | 2024.07.30 |
---|---|
[Oracle] ORA-00904: invalid identifier, 부적합한 식별자 (0) | 2024.07.30 |
[Oracle] ORA-01849: 시간은 1에서 12 사이어야 합니다 (0) | 2020.08.19 |
[Oracle] ORA-01810: 형식 코드가 두 번 나타났습니다 (0) | 2020.08.19 |
[Oracle] ORA-01861: 리터럴이 형식 문자열과 일치하지 않음 (1) | 2020.08.19 |