티스토리 뷰

반응형

 

 

 

 



 

 

oracle

 

 

 

보통 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가 가능해지는 것이다.

 

 

 

그래서 더 오래 남겨야한다면 조정을 통해 유지하게 끔 해줄 필요는 있다.

 

 

 

 



 

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total
Today
Yesterday