에러 코드: 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는 다음과 같은 조치를 취할 수 있습니다:
- UNDO 테이블스페이스 확장: 데이터베이스의 UNDO 공간을 확장하여 더 많은 이전 데이터 버전을 보관할 수 있도록 합니다.
- 쿼리 최적화: 긴 쿼리의 실행 시간을 단축하기 위해 쿼리를 최적화하고, 가능한 경우 배치 처리를 단위로 나눕니다.
- 트랜잭션 관리 강화: 큰 트랜잭션을 여러 작은 트랜잭션으로 분할하여 자주 커밋함으로써 UNDO 데이터의 지속적인 활용 가능성을 높입니다.
※ 요약
"ORA-01555: snapshot too old" 에러는 긴 쿼리 실행 도중 필요한 이전 데이터 버전을 유지할 수 없을 때 발생합니다. DBA는 UNDO 공간을 적절히 관리하고, 쿼리 및 트랜잭션 처리를 최적화하여 이 문제를 해결할 수 있습니다. 이를 통해 데이터의 일관성과 시스템의 안정성을 보장할 수 있습니다.
예시) 사용자 A가 원하는 데이터를 찾기 위해 Buffer Cache에 가보았으나, 이미 데이터가 B 사용자에 변경 되었기 때문에 SQL 수행 했던 시점에서 원하는 데이터를 찾기위해 UNDO SEGMENT에 가야합니다. 그 원하는 시점의 데이터는 위 2번에서 B 사용자가 수정하거나, 삭제 작업으로 UNDO에 옮겨져 있습니다. 그런데 UNDO도 유한한 파일로 운영되기 때문에 대량의 UNDO 등록이 올 경우, 이전 UNDO 데이터를 덮어 써야합니다. 그래서 A 사용자 쿼리와 같이 복잡한 쿼리들이 장시간 수행되는 경우에 UNDO에 데이터를 찾으가는 경우가 발생하게 되면 위와 같은 에러가 발생합니다.
'ORACLE > ERROR CODE' 카테고리의 다른 글
ORA-02292 : integrity constraint violation - child record found (0) | 2024.04.19 |
---|---|
ORA-00942 : table or view does not exist (2) | 2024.04.19 |
ORA-04031 : unable to allocate bytes of shared memory ("area","object","subpool","allocation name") (1) | 2024.04.19 |
ORA-00904 : invalid identifier (1) | 2024.04.19 |
ORA-06502 : PL/SQL: numeric or value error (0) | 2024.04.19 |