2017년 6월 22일 목요일

(Oracle Tip) 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; 감사합니다.

댓글 없음:

댓글 쓰기