Oracle

timestamp 이용하여 테이블 복구(Table recovery using timestamp)

민이단 2023. 7. 4. 15:04

최근 사이트에서 고객이 특정 테이블의 패스워드컬럼에 DML를 실수로 날리고 commit했다고 하여 DML 전 시점으로 변경을 해달라고 요청이 왔다.

일단 undo_retention 확인하였고 정확히 기억은 안나지만 10시간정도 설정 되어있었던 것 같다.

(show parameter undo)

 

일단 테이블명 확인 후 이 전 값으로 되돌려야하는 테이블의 컬럼명과 특정값 몇개를 제공받았다.

 

고객이 정확한 DML 시점을 몰라서 30분 단위로 조회해서 값이 틀려지는 부분을 체크하였다.

============================================================================================

과거 시간별 Values 조회

============================================================================================

(30분전 table조회)

SQL> select name, LOGIN_PASSWD from TABLE_NAME
AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '30' MINUTE) 
where name='민';

 

(60분전 table조회)
SQL> select name, LOGIN_PASSWD from TABLE_NAME
AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '60' MINUTE) 
where name='민';

 

# 민의 LOGIN_PASSWD 결과 값이 60분이전에 DML 이전 값이 있는 것을 확인하였다.

 

============================================================================================

CTAS로 60분전의 table을 생성

============================================================================================

SQL> create table TABLE_NAME_BAK as select * from TABLE_NAME AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '60' MINUTE);

 

 

============================================================================================

테이블 LOGIN_PASSWD 값 전체를 60분전으로 update

============================================================================================

SQL> UPDATE USR_GLOBAL A
SET (A.LOGIN_PASSWD) = (SELECT B.LOGIN_PASSWD
                         FROM USR_GLOBAL_BAK B
                        WHERE B.USER_ID = A.USER_ID)

 

테이블 LOGIN_PASSWD 값 전체를 60분전으로 돌려도 무방하다고 하여 전체 값을 update로 변경하였다. 

원하는 values만 변경하고 싶을때는 where 절대 조건을 변경하면 될 것이다^^.