본문 바로가기
Data & Programming/Oracle

[오라클-오류] ORA-01555: snapshot too old

by 눈부셔™ 2023. 8. 14.
728x90

[Oracle-오류] ORA-01555: snapshot too old

오라클 데이터베이스에서 발생할 수 있는 문제 중 하나인 ORA-01555 오류는 'Snapshot too old'로도 알려져 있으며, 데이터 읽기 작업 중에 데이터의 일관성을 유지하기 위한 롤백 세그먼트의 상태가 변화하여 데이터의 일부 또는 전체를 읽을 수 없을 때 발생합니다. 이 글에서는 ORA-01555 오류 코드에 대해 자세히 설명하고, 이 오류가 발생하는 원인과 해결 방법에 대해 알아보겠습니다.

ORA-01555: snapshot too old

오류 내용

ORA-01555 오류는 "Snapshot too old"라는 내용으로 표시됩니다.

이 오류는 데이터 읽기 작업 중에 해당 데이터의 일관성을 보장하기 위해 사용되는 롤백 세그먼트의 상태가 변화하여 데이터의 버전이 사라져 더 이상 읽을 수 없을 때 발생합니다.

즉, 해당 데이터가 더 이상 사용 가능하지 않은 상태일 때 이 오류가 표시됩니다.

 


오류 발생 원인

ORA-01555 오류가 발생하는 주요 원인은 다음과 같습니다:

  • UNDO 테이블스페이스 공간 부족: 롤백 세그먼트에 대한 UNDO 정보를 유지하는 UNDO 테이블스페이스의 공간이 부족한 경우에 데이터의 일부 버전이 유지되지 못하고 삭제되어 ORA-01555 오류가 발생할 수 있습니다.
  • 긴 트랜잭션: 하나의 트랜잭션이 길게 실행되어 해당 트랜잭션의 일부 버전을 보유하고 있는 롤백 세그먼트가 사라져 버전이 손실된 경우에도 ORA-01555 오류가 발생할 수 있습니다.
  • 낮은 UNDO 레텐션 설정: UNDO 레텐션 파라미터가 낮게 설정되어 롤백 세그먼트가 이전 버전을 보유하지 못하는 경우에도 ORA-01555 오류가 발생할 수 있습니다.

 

해결 방법

ORA-01555 오류를 해결하려면 다음과 같은 접근 방법을 고려할 수 있습니다:

    • UNDO 테이블스페이스 확장: UNDO 테이블스페이스의 공간을 추가하여 롤백 세그먼트가 충분한 공간을 확보하도록 합니다.
1
ALTER DATABASE DATAFILE '파일_경로' RESIZE 새로운_크기;
cs
  • UNDO 레텐션 설정 변경: UNDO 레텐션 파라미터를 조정하여 롤백 세그먼트가 버전을 유지할 수 있는 시간을 늘릴 수 있습니다.
  • 트랜잭션 분할: 긴 트랜잭션을 여러 개의 작은 트랜잭션으로 분할하여 롤백 세그먼트의 버전 충돌을 방지합니다.

 

예제

다음은 ORA-01555 오류가 발생하는 예제입니다.

1
2
3
4
5
-- 세션1
UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 123;
 
-- 세션2
DELETE FROM employees WHERE employee_id = 123-- 이로 인해 ORA-01555 오류가 발생합니다.
cs

이 예에서 세션 1은 employee_id = 123인 직원의 급여를 업데이트합니다. 동시에 세션 2는 동일한 직원을 삭제하려고 시도합니다. 두 세션 모두 동일한 데이터를 수정하려고 하기 때문에 둘 중 하나에 ORA-01555 오류가 발생합니다.

 

이 오류를 방지하려면 애플리케이션에서 동시성을 적절하게 관리해야 합니다. 이는 행 수준 잠금과 같은 잠금 메커니즘을 사용하거나 버전 관리와 같은 낙관적 잠금 기술을 사용하여 수행할 수 있습니다.

이 오류가 발생하면 다른 세션이 잠금을 해제할 때까지 기다린 다음 작업을 다시 시도할 수 있습니다.

또 SELECT FOR UPDATE 문을 사용하여 수정하려는 행을 실제로 수정하기 전에 잠글 수 있습니다.

다음은 이 오류를 방지하기 위해 SELECT FOR UPDATE 문을 사용하는 방법의 예입니다.

1
2
3
4
5
6
7
-- 세션1
SELECT * FROM employees WHERE employee_id = 123 FOR UPDATE;
UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 123;
 
-- 세션2
SELECT * FROM employees WHERE employee_id = 123 FOR UPDATE;
DELETE FROM employees WHERE employee_id = 123;
cs

 

결론

ORA-01555 오류는 데이터 읽기 작업 중에 롤백 세그먼트의 상태 변화로 인해 데이터의 일부 또는 전체를 읽을 수 없을 때 발생하는 오류 코드입니다. 데이터베이스의 일관성을 유지하고 데이터의 무결성을 보장하기 위해 UNDO 관련 설정 및 트랜잭션 관리에 주의를 기울이는 것이 중요합니다. 오류 발생 시 적절한 조치를 취하여 데이터의 손실을 최소화하고 데이터베이스의 안정성을 확보하세요.

 


#Oracle  #오라클  #오라클 오류코드  #ORA-01555  #Snapshot too old  #롤백 세그먼트  #데이터 일관성

728x90