Snapshot too old 에러는 Oracle DBMS 의 Undo Segment (롤백세그먼트) 와 관련된 에러입니다.
여기에서 Snapshot 이란 Oracle Materialized View 의 옛이름인 Snapshot 과는 아무 관계가 없습니다. ㅎㅎ
그냥 Undo Segment 에 저장된(스냅샷된) 옛날 블록 이미지란 의미입니다.
아래와 같은 시나리오에서 ORA-01555 에러를 만나게 됩니다.
1) P1 세션이 T1 테이블의 1번째 블록부터 순차적으로 조회를 시작했습니다.
2) P2 세션이 T1 테이블의 20000번째 블록 데이터를 변경해버렸습니다.
(변경된 데이터는 롤백세그먼트로 이동합니다.)
3) 그런데, 다른 세션들이 변경 작업이 많아서 롤백세그먼트에 들어있는 T1 테이블의 20000번째 블록이 날라갔습니다.
(롤백세그먼트는 재활용되어 사용되어지기 때문에 흔한 일입니다)
4) P1 세션이 T1 테이블의 20000번째 데이터를 조회를 하려고 하는데, 없습니다.
(여기에서 ORA-01555 에러가 납니다)
즉, Snapshot too old 에서 Snapshot 이란 이전 변경전 블록이미지를 롤백세그먼트에 스냅샷(보관) 찍어 놨음을 의미합니다.
이 스냅샷 찍어놓은 이미지가 너무 오래되어(too old) 날라가는 통에 롤백세그먼트에 없으니 조회를 할 수 없음을 의미합니다.
여기에서 다음과 같은 상황이었다면, P1 세션은 ORA-01555 에러를 만나지 않았을 가능성이 높습니다.
- 롤백세그먼트(Undo Segment) 가 충분히 큰 경우 (재활용되어 20000번째 Old 이미지가 날라갈 확률이 적어집니다)
- P1 세션의 조회작업이 빨리 끝나버리는 경우 (Long SQL 은 ORA-01555 에러를 만날 가능성이 더 많아집니다)
결론적으로 ORA-01555 에러의 조치방법은
- 롤백세그먼트 크기를 늘려주고,
- Long SQL 을 튜닝해서 빨리 끝날 수 있도록
하면 되겠습니다.
이것도 참고요 => 오라클 Alertlog 파일 분석 프로그램 다운로드