반응형

ㅈㅈ 데이터 날려먹음

보통 개발자들은 DB까지 다룬다.
전문적인 DBA가 아니다 보니, 바쁘게 개발하면서 실수로 데이터를 날려먹거나
UPDATE를 잘못쳐서 잘못 변경되는 일이 많다.
개발DB에 붙여서 쿼리실행한줄 알았더니, 알고보니깐 운영DB던가...

다른 큰 기업들은 개발자들과 DBA가 정확하게 나뉘어서 
개발자들이 DB까진 컨트롤하진 않지만, 그게 아닌 사람들은 DB까지 많이 다룬다.
(지식만 있어서는 안되고, 실제 쿼리작성 및 실행함.  단, 모든 중소기업이 다 그렇진 않음)

어찌됐든, 실수로 UPDATE나 DELETE해버린 내역을 복구하기 위한 방법이다.
(오라클에 한함, 다른DBMS는 모르겠음)

 

먼저 테이블 명이 SAMPLE_TABLE이라는게 있다고 하자.
여기서 내가 WHERE조건이 ABC라는 키값의 값을 실수로 DELETE했다고 치자, 그 다음에 아래 쿼리를 조회하면?

SELECT  *  
FROM SAMPLE_TABLE
WHERE  = 'ABC'

당연히 위 쿼리의 결과값은 당연히 아무것도 나오지 않을것이다.

하지만, FROM 절의 테이블명 뒤에 아래 구문을 붙여준다면?

AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE)

(▼붙여서 실행)

SELECT  *  
FROM SAMPLE_TABLE AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE)
WHERE  = 'ABC'

내가 삭제하기 전의 값이 추출된다.(10분 이전의 데이터) 물론 10분만 되는것은 아니고 그 이상 가능하다. 
단위는 SECOND, MINUTE, HOUR, DAY로 바꿔 쓸 수 있다.

복구를 하려면 , 아래쿼리 처럼 하면 되겠다.

INSERT INTO SAMPLE_TABLE 
SELECT  *  
FROM SAMPLE_TABLE  AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE)  
WHERE ID = 'ABC'​

*애스터리스크를 사용한건 같은테이블에 순서대로 변경없이 모든컬럼에 넣기 위함이다.


컬럼별로 값을 다르게 하거나, 지정하려면 컬럼명을 기재해야한다. 다른테이블에 넣을때도 마찬가지다.
다른 테이블에 넣을땐, INSERT INTO 다른테이블명 .... 을 써서 INSERT한다.

실수로 날려먹었다고 당황하지말자. 

반응형

+ Recent posts