Undo 관련 에러와 관련 parameter(feat.ORA-01555)
"ORA-01555.Snapshot too old"
라는 undo 관련 에러가 있다.
일반적으로 쿼리 수행기간이 오래 걸려서 발생하는 undo 에러인데, SQL 수행과정에서 읽고자하는 데이터가 다른 Transction에 의해 변경되고, 변경 전 데이터를 읽지 못해 생기는 에러다.
음...이해가 가나?

오라클 DB는 예시를 들어야 이해가 빠르다. 예를 들어보겠다.
사용자 A가 1시간이 넘게 걸리는 특정 데이터의 집계 작업용 select를 하고 있다고 가정하겠다.
이때 사용자 B가 사용자 A가 집계중인 데이터를 Update한 후 Commit을 할 경우에, A는 변경 전의 데이터를 Undo segment서 찾아서 집계를 해야한다. 그런데 만약 사용자 B가 Commit을 한 후에 사용자 C가 사용자의 Undo Segment를 덮어 쓴다면 A는 집계 쿼리를 완성 할 수 없게 되고 이때 발생하는 에러가 ORA-01555.Snapshot too old 이다.
이 에러가 발생하는 현상을 막아야하는데, 이때 사용되는 파라미터가 Undo_retention이다.
UNDO_RETENTION(단위는 초)
COMMIT 수행 후에도 undo_segment 내의 데이터를 다른 서버 프로세스가 덮어 쓰지 못하도록 막아주는 시간을 나타내는 파라미터다. 이 파라미터는 주로 CR작업으로 Undo Segment에 있는 데이터를 조회해야하는 경우에 많이 발생한다.
아까 같은 에러 상황에서 UNDO_RETENTION을 통해 원본데이터를 유지시켜준다.
그러나 이 파라미터는 Undo Segment 여분이 있을 경우에만 적용되며 만약 모든 Undo Segment가 사용중일 경우에는 적용되지 않는다.
UNDO_RETENTION_GUARANTEE
UNDO_RETENTION파라미터는 Undo Segment 양이 부족하면 설정된 값이 부시되고 Undo Segment가 재사용 되어 버린다. 이러한 재사용을 막기 위해 UNDO_RETENTION_GUARANTEE 파라미터를 설정하게 되면 UNDO_RETENTION파라미터로 설정된 시간 동안 재활용을 하지 않고 데이터를 지켜준다.
단, 문제는 Commit을 수행해도 재활용하지 않기 때문에 Undo Tablespace의 사용량이 증가 될 수 있다.
그래서 NOGUARANTEE(사용 안함)이다.
그리고 Oracle 10g버전부터는 undo retention을 자동으로 관리하는 기능을 제공한다.
D.O.N.E!!!
