Oracle2016. 11. 25. 11:55

Database 사용하다가 실수로 Update 나 Delete를 잘못할수도 있다.


Commit을 하였어도 어느 정도의 시간내에서는 시간을 거슬러서 그 시점에서의 Data 상태를 볼수가 있다.


※ 어느 정도의 시간이란 운영중인 DB의 트랜잭션양에 영향을 받기 때문에 그 정도를 가늠하기는 어렵다.


-- 해당 데이터의 10초전 상태를 조회

SELECT * 

  FROM [table_name]

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

WHERE [column_name] = '_______'


AS OF TIMESTAMP 문의 위치는 FROM [table_name] 과 WHERE 사이에 위치한다.


-- 해당 데이터의 10분전 상태를 조회

SELECT * 

  FROM [table_name]

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

WHERE [column_name] = '_______'

-- 해당 데이터의 1시간전 상태를 조회

SELECT * 

  FROM [table_name]

  AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' HOUR) 

WHERE [column_name] = '_______'


-- 해당 데이터의 1일전 상태를 조회

SELECT * 

  FROM [table_name]

  AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' DAY) 

WHERE [column_name] = '_______'


또 다른 사용방법은 원하는 시간으로 바로 설정하여 조회할 수 있다.

-- 지정한 시간 시점에서의 데이터 상태를 조회

SELECT * 

  FROM [table_name]

  AS OF TIMESTAMP TO_TIMESTAMP('2016-11-25 10:39:58', 'YYYY-MM-DD HH24:MI:SS') 

WHERE [column_name] = '_______'




* 위의 기본문법으로 아래와 같이 응용을 해볼수도 있다.


- 동일한 데이터를 시간차를 두고 비교를 하는 형식으로도 써보았다.

  두 시간 사이의 데이터 비교도 유용하게 써먹어 본적이 있다.

SELECT .... 

AS OF TIMESTAMP TO_TIMESTAMP('2016-11-25 10:55:58', 'YYYY-MM-DD HH24:MI:SS') 

WHER....

Union All 

SELECT ....

AS OF TIMESTAMP TO_TIMESTAMP('2016-11-25 11:05:10', 'YYYY-MM-DD HH24:MI:SS')

WHER....



- 조회된 데이터를 근거로 현재의 데이터를 다시 Update하거나, 


삭제된 경우라면 

 INSERT INTO [table_name]

SELECT * 

  FROM [table_name]

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

WHERE [column_name] = '_______'


 이런 형식으로 데이터를 복구할 수 있다.

Posted by kongzz