티스토리 뷰
보통 Delete 쿼리를 조건절 잘못작성하여 삭제되지 말아야할 데이터가 삭제되는 경우가 있다.
급하게 일처리 하다 보면 실수를 하기 마련...
다행히 oracle 은 일정시간 동안, UNDO(undo_retention) 보관시간 내에 데이터를 조회 할 수 있다.
예를 들어 조건절 없이 table 에 데이터를 모두 삭제했다고 치자
DELETE FROM sample
-- where ...
OMG...
당황하지 말고 삭제 시점 전 으로 조회하여 데이터 추출하여 복구하면 된다.
예를 들어 내가 09:03:45 경 삭제를 했다고 치자
SELECT * FROM sample AS OF TIMESTAMP TO_TIMESTAMP('2025-10-21 09:02:00','YYYY-MM-DD HH24:MI:SS')
이렇게 분,초 까지 세분화해서 삭제된 데이터를 추출할 수 있다.
* 직접 날짜시분초를 작성하지 않고 SYSDATE에서 분을 빼도 된다.
일단 데이터가 존재하지 얼마나 다행인가
이제 복구할때는 여러가지 방법이 있다.
테이블이 완전 비어져 있다면
INSERT INTO sample
SELECT * FROM sample AS OF TIMESTAMP TO_TIMESTAMP('2025-10-21 09:02:00','YYYY-MM-DD HH24:MI:SS')
이렇게 해도 상관 없겠지만
데이터가 계속 인입되고 있다거나 일부만 삭제했다면 temp 테이블에 먼저 백업을 떠논 후 데이터를 넣어주는 것이 안전하겠다.
NOT EXISTS 조건 걸어서 중복 제거하고 넣어줘도 된다.
CREATE TABLE sample_tmp as
SELECT * FROM sample AS OF TIMESTAMP TO_TIMESTAMP('2025-10-21 09:02:00','YYYY-MM-DD HH24:MI:SS')
이렇게 temp 테이블 만들어서 빼놓고 조정을 하고 복구해도 된다.
그럼 UNDO 보관시간은 얼마나 되냐 궁금할 수 있는데
SELECT name, value
FROM v$parameter
WHERE name = 'undo_retention';
undo 유지 시간은 디폴트로 900 일 것이다.
대략 15분 (900/60) 인데
이것이 15분간만 유지하겠다는 아니고 최소한 15분은 유지하려고 노력하겠다여서
UNDO_RETENTION은 “최소 보존 목표값”일 뿐, 절대값이 아님
오라클 공식 문서의 표현:
“UNDO_RETENTION specifies the minimum time in seconds that Oracle attempts to retain old undo information for consistent read and flashback.”
‘900초 동안은 최소한 유지하려고 노력하지만, 공간이 남으면 더 오래 유지한다’
따라서
UNDO 테이블스페이스에 공간 여유가 많을 경우,
이전 트랜잭션의 UNDO 블록이 덮이지 않고 그대로 남아 있음 → 그만큼 과거 시점으로 Flashback Query가 가능해지는 것이다.
그래서 더 오래 남겨야한다면 조정을 통해 유지하게 끔 해줄 필요는 있다.
'Database > Oracle' 카테고리의 다른 글
| [Oracle] 재기동 하기 (feat.linux) (0) | 2024.08.06 |
|---|---|
| [oracle] 오라클 ODAC 설치 및 연동 (64비트) (0) | 2024.07.25 |
| [Oracle] ORDER BY 정렬 특정값 마지막으로 정렬시키기. (0) | 2024.05.09 |
| [ORACLE] 분기 구하기 (0) | 2022.12.29 |