ORA-01555 : snapshot too old

에러 코드: ORA-01555

에러 메시지: "snapshot too old" (스냅샷이 너무 오래됨)

 

발생 원인

이 에러는 오라클 데이터베이스에서 긴 실행 시간을 갖는 쿼리가 실행되는 동안 필요한 이전 데이터 버전(스냅샷)을 유지하기 위해 사용되는 UNDO 데이터가 오버라이트되어 발생합니다. 이는 큰 트랜잭션이 진행 중일 때 다른 트랜잭션이 동일한 데이터를 수정하면서 발생할 수 있습니다.

 

예제

회사의 재무 부서에서 연말 결산 작업을 진행하는 동안 다음과 같은 상황에서 ORA-01555 에러가 발생할 수 있습니다:

재무 부서는 transactions 테이블에서 올해의 모든 거래를 검토하고 요약하는 복잡한 쿼리를 실행합니다. 이 쿼리는 데이터가 많아 처리 시간이 길어집니다.

 

EGIN
    FOR rec IN (SELECT * FROM transactions WHERE transaction_yyyymmdd BETWEEN '20240101' AND '20241231' ORDER BY transaction_date) LOOP
        -- 각 거래에 대한 복잡한 처리 로직
    END LOOP;
END;

 

동시에, 다른 부서의 사용자가 2021년 중 일부 데이터를 업데이트하는 작업을 수행하고 있습니다. 이 때문에 원래 재무 부서에서 사용하던 스냅샷의 데이터가 변경되어 UNDO 공간이 필요하게 됩니다. 그 결과, 재무 부서의 긴 쿼리 실행 중 필요한 이전 데이터 버전을 유지할 수 없게 되어 ORA-01555 에러가 발생합니다.

 

해결 방법

이 에러를 효과적으로 해결하기 위해 DBA는 다음과 같은 조치를 취할 수 있습니다:

  1. UNDO 테이블스페이스 확장: 데이터베이스의 UNDO 공간을 확장하여 더 많은 이전 데이터 버전을 보관할 수 있도록 합니다.
  2. 쿼리 최적화: 긴 쿼리의 실행 시간을 단축하기 위해 쿼리를 최적화하고, 가능한 경우 배치 처리를 단위로 나눕니다.
  3. 트랜잭션 관리 강화: 큰 트랜잭션을 여러 작은 트랜잭션으로 분할하여 자주 커밋함으로써 UNDO 데이터의 지속적인 활용 가능성을 높입니다.
  4.  

요약
"ORA-01555: snapshot too old" 에러는 긴 쿼리 실행 도중 필요한 이전 데이터 버전을 유지할 수 없을 때 발생합니다. DBA는 UNDO 공간을 적절히 관리하고, 쿼리 및 트랜잭션 처리를 최적화하여 이 문제를 해결할 수 있습니다. 이를 통해 데이터의 일관성과 시스템의 안정성을 보장할 수 있습니다.

예시)  사용자 A가 원하는 데이터를 찾기 위해 Buffer Cache에 가보았으나, 이미 데이터가 B 사용자에 변경 되었기 때문에 SQL 수행 했던 시점에서 원하는 데이터를 찾기위해  UNDO SEGMENT에 가야합니다. 그 원하는 시점의 데이터는 위 2번에서 B 사용자가 수정하거나, 삭제 작업으로 UNDO에 옮겨져 있습니다. 그런데 UNDO도 유한한 파일로 운영되기 때문에 대량의 UNDO 등록이 올 경우, 이전 UNDO 데이터를 덮어 써야합니다. 그래서 A 사용자 쿼리와 같이 복잡한 쿼리들이 장시간 수행되는 경우에 UNDO에 데이터를 찾으가는 경우가 발생하게 되면 위와 같은 에러가 발생합니다.