2015년 10월 5일 월요일

SCN_TO_TIMESTAMP 함수를 이용하여 FLASHBACK으로 데이터 복구

-- 테이블을 조회하고 UPDATE하려 합니다.
SELECT SALARY -- 3800
  FROM HR.EMPLOYEES
 WHERE EMPLOYEE_ID = 188;

--이렇게 UPDATE하려 했습니다.
UPDATE HR.EMPLOYEES SET SALARY = SALARY*10
 WHERE EMPLOYEE_ID = 188;

-- 그런데 이렇게 UPDATE해 버렸습니다.
UPDATE HR.EMPLOYEES SET SALARY = SALARY*10;

COMMIT;

-- 테이블 전체를 UPDATE하고 COMMIT까지 해 버렸습니다.

SELECT SALARY -- 38000
  FROM HR.EMPLOYEES
 WHERE EMPLOYEE_ID = 188;

-- 모든 직원의 월급이 10배로 뛰었습니다. 복구해야 지요.(그냥 나둘까요?)

-- ORA_ROWSCN 는 Pseudocolumns 입니다. ORACLE이 만들어 주는 의사 컬럼 입니다.
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) -- 2015-04-21 12:28:26.000000000
  FROM HR.EMPLOYEES;

FLASHBACK TABLE HR.EMPLOYEES TO TIMESTAMP
  TO_TIMESTAMP('2015-04-21 12:28:26.000000000', 'YYYY-MM-DD HH24:MI:SS.FF');

-- ORA-08189: 행 이동이 사용으로 설정되지 않았으므로 테이블을 플래시백할 수 없음
-- 위를 실행하면 메세지 같은 오류가 납니다.

ALTER TABLE HR.EMPLOYEES ENABLE ROW MOVEMENT;
-- 위와 같이 테이블을 수정합니다.

FLASHBACK TABLE HR.EMPLOYEES TO TIMESTAMP
  TO_TIMESTAMP('2015-04-21 12:28:26.000000000', 'YYYY-MM-DD HH24:MI:SS.FF');
-- 다시 실행하면 복구가 됩니다.

-- 확인하면 UPDATE 이전으로 복구 되었습니다.
SELECT *
  FROM HR.EMPLOYEES;

-- 테이블도 원래 상태로 되돌립니다.
ALTER TABLE HR.EMPLOYEES DISABLE ROW MOVEMENT;

감사합니다. 

댓글 없음:

댓글 쓰기