ORACLE DATA 오라클 데이터 복구 (일정 시간 이내)

Oracle

DB를 사용하다 보면 정말 난처한 상황에 직면할 때가 있다..
예를 들어서  중요한 회원 데이터 테이블을 핸들링 하다가 정신이 없어서
WHERE 
문을 잊었다…? 오마갓.. 대형 사고다

이번 포스팅에서는 ORACLE에서 실수로 날려버린! (혹은 수정해버린데이터를 복구할 수 있는 소중한 쿼리를 알아보도록 하자.

다음과 같은 예를 들어보자.

위와 같은 구조의 PULLIM_ORA_TEST라는 테이블이 있다.

이제  DB 배워서 관리하게  ‘가상 전산 관리자 ‘풀리미 회원가입 테스트를 위해 자신의 기존 아이디를 삭제하고자 한다.

그를 위해 다음과 같이 SQL 문을 작성하고 실행커밋을 하기에 이른다.
DELETE FROM PULLIM_ORA_TEST;
COMMIT;

헐 그런데..!! 큰일이 났다
커밋을 완료 한 후 정신을 차려보니 WHERE 문을 빼먹었네..??!!
미칠 노릇.. 죽을 노릇이다… 이를 어째…?
아주 활발한 커뮤니티는 아니지만 그래도 꽤 많은 회원들이 하루에도 방문하는 그런 커뮤니티의 회원 DB가 유실된 것이다

목숨의 위협을 느끼고 삶과 죽음의 문턱을 넘나들던 ‘풀리미는 선배 ‘디비맨에게 전화를 걸어서 도움을 요청한다.
디비맨은 당황하지 않고 두려움에 떨고 있을 ‘풀리미에게 차분하게 묻는다. (이런 선임만 존재한다면 얼마나 좋을까)

디비맨 : 커밋 한지 몇 분이나 되었지?
풀리미 :  3~5분 정도 되었어요.
디비맨 : 빨리 전화하길 잘 했네.. 여차여차해서 이래 저리하면 된다걱정 말고그럴 수도 있는 거야그러면서 배워 가는 거지~

풀리미가 디비맨에게 설명 들은 대로 빠른 조치를 해서 커뮤니티는 다시 정상화되었다는 후문이 있다.

어떤 방법으로 삭제하고 커밋까지 해버린 데이터를 살릴 수 있었을까?

간단하다.
SELECT * FROM ‘
복구할테이블명‘ AS OF TIMESTAMP(SYSTIMESTAMP – INTERVAL ‘원하는시간‘ MINUTE);
위와 같은 쿼리를 날리면 ‘원하는시간내에 존재하던 데이터들을 확인할 수 있다.
오라클에서 데이터를 삭제 혹은 업데이트 시에도 시스템에 설정된 일정 시간 동안은 데이터를 메모리 상에 적재하게 되는데그 시간을 넘기지 않았다면 데이터를 살릴 수 있다.
일반적으로 30분 정보가 DEFAULT 값이므로.. 뭔가 데이터를 날렸다 싶으면 30분 이내로 위의 쿼리를 사용하면 데이터를 복구할 수 있다.

풀리미가 사용한 쿼리는 다음과 같다.
SELECT * FROM PULLIM_ORA_TEST AS OF TIMESTAMP(SYSTIMESTAMP – INTERVAL ‘5’ MINUTE);
위와 같이 쿼리를 날려주자 날아가 버렸던… 회원 데이터들이 나타났다!

데이터가 살아있는 것을 확인했으나 이걸로 끝이 아니다!
지금  데이터는 메모리 상에 적재되어있는 데이터로 시간이 지나면 사라져버린다.
 데이터가 사라지기 전에 다시 원래의 테이블에 넣어주어야 한다.

다음과 같이 처리하면 다시 데이터를 기존의 테이블에 복구할  있다.
INSERT INTO PULLIM_ORA_TEST SELECT * FROM PULLIM_ORA_TEST AS OF TIMESTAMP(SYSTIMESTAMP – INTERVAL ‘5’ MINUTES);
COMMIT;

위와 같이 쿼리문을 입력 후 실행하고 커밋을 하자 회원 테이블에 회원 데이터들이 정상적으로 입력되었다.

어떤가간단하지 않은가?
정말 간단하지만… 때에 따라서는 DBA의 생명을 살리는 소중한 쿼리이다..
잘 기억해 두자.

SQL 문 만을 설명하자면 딱딱하고 재미가 없기에 다소 멍청해 보이긴 하지만 상황을 설정하고 설명해보았다.

정말 어리바리 해 보이지만 바쁘고 정신없는 상황에 이 테이블 저 테이블 옮겨 다니면서 작업을 하다 보면 간혹 있을 법 한 상황이다.
필자의 경우 애플리케이션 개발을 하던 도중 WHERE 문 사용 실수로 중요한 데이터를 잘 못 핸들링 한 경험이 있는데 위의 쿼리를 알게 되어서 다행히도 모든 데이터를 원래대로 복구할 수 있었다.
그때를 생각하면 정말… 끔찍했다… 죽다 살아난 기분ㅎㅎ

요약하자면,
1. INSERT, UPDATE, DELETE 
문 사용 시에는 항상 WHERE 문을 꼼꼼하게 체크하자!
2. 
혹여 실수로 잘못 핸들링 했을지라도 당황하지 말고 ROLLBACK을 하자!
3. ROLLBACK
할 겨를도 없이 COMMIT을 날려버렸다면 당황하지 말고 빠른 시간 내에 위의 쿼리를 사용하여 데이터를 복구하자! (임시 테이블을 만들어서 그곳에 복구한 후 필요한 데이터만 선별적으로 INSERT 하는 것을 권장)

댓글 남기기