공부 이야기

[oracle] FLASH BACK 으로 삭제, 업데이트된 데이터 복구

판다(panda) 2017. 8. 16. 00:00

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 을 하시란걸 당부하면서..


성공적인 복구 되시기를..