최근 사이트에서 고객이 특정 테이블의 패스워드컬럼에 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 절대 조건을 변경하면 될 것이다^^.
'Oracle' 카테고리의 다른 글
| ora-600[kdsgrp1](index/table corrupt/crash) , ora-600[6006](check corrupt and smon kill db) (0) | 2023.07.04 |
|---|---|
| oracle 9i to 10g upgrade 작업 (0) | 2023.07.04 |
| log file parallel write wait event (0) | 2023.07.03 |
| archive log 보관 주기 설정(Set the archive log retention period) (0) | 2023.07.01 |
| 오라클 cpu 사용량 높은 프로세스 쿼리 조회 (How to query oracle cpu usage high process query) (0) | 2023.06.29 |