[oracle] FLASH BACK 으로 삭제, 업데이트된 데이터 복구
DB를 만지고 작업을 하는 사람으로.. 가끔 말도 안되는 실수를 저지르곤 합니다..
예를 들면 이런것이죠..
특정 테이블 TABLE1 란 곳에 B란 컬럼을 UPDATE 하려고 할때..
A컬럼 |
B컬럼 |
1 |
insert 합니다. |
UPDATE TABLE1 SET
B = 'update 합니다.';
업데이트 쿼리문을 쓰는데요..
데이터가 여러개일때..
저렇게 업데이트를 하면..
A컬럼 |
B컬럼 |
1 |
update 합니다. |
2 |
update 합니다. |
3 |
update 합니다. |
4 |
update 합니다. |
로 모든 데이터들이 업데이트가 됩니다..
UPDATE TABLE1 SET
B = 'update 합니다!.'
WHERE A = '2';
조건을 줘야 해당 데이터만 변경이 되죠..
A컬럼 |
B컬럼 |
1 |
insert 합니다. |
2 |
update 합니다!. |
3 |
select 합니다. |
4 |
delete 합니다. |
그런데.. 위에 처럼 조건을 빼고 업데이트를 하고.. commit 까지 하는 경우가 아주 가끔(AUTO COMMIT일때); 있습니다..
그럼 다시 복원을 해야하는데..
몇 건 안되면서 해당 B 컬럼에 데이터가 뭔지 알면.. 큰 문제는 되지 않을겁니다..
해당 B 컬럼의 데이터를 얼른 수정해주면 되거든요;..
그런데.. 데이터가 약 10만건이라면?..
A컬럼 |
B컬럼 |
1 |
update 합니다. |
... |
... |
99998 |
update 합니다. |
99999 |
update 합니다. |
그리고 해당 B컬럼에 들어가는 데이터들이 뭔지 모른다면?..
그럼 난리 나는거죠;..
자.. 이미 데이터는 업데이트 되고.. 커밋까지 완료된 상황입니다..
다시 원래되로 복원하려면..
빠른 시간내에.. 작업을 해야합니다..
시간이 지날수록 복원 작업이 어려워지기 때문이죠.. 어려워지는거지 안되는건 아닙니다..
복원 쿼리 들어갑니다..
UPDATE TABLE1 AA SET B = ( SELECT B FROM TABLE1 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) WHERE NO = AA.NO )
해당 TABLE1 의 칼럼 B를 10분 전 TABLE1 의 칼럼 B로 다시 업데이트를 하는것이죠..
그렇기 때문에.. 해당 10분 안에 작업하신분들은 다시 10분 전 상태로 돌아가게 되니.. 그 점을 유의하셔야됩니다..
그럼 이번에는 데이터를 삭제를 했다?.. 커밋까지 완료된 상황에서는 어떻게 할까요?..
INSERT INTO TABLE1 AA SELECT * FROM TABLE1 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) WHERE NO = AA.NO
10분 전 데이터를 다시 인서트하면 되겠죠..
앞으로는 UPDATE, INSERT, DELETE 하기 전에.. 한번 더 확인을 하고.. COMMIT 을 하시란걸 당부하면서..
성공적인 복구 되시기를..