ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ORACLE] ORA-01555 : SNAPSHOT TOO OLD 에러 [ +SnapShot ]
    Error Note/Error Note 2023. 2. 20. 17:45

    담당 운영 시스템의 배치 중에 오래 수행되는 배치가 있었는데,

    에러 모니터링 문자가 와서 로그를 확인해보니 오라클 에러가 발생했었다.

     

    ORA-01555 : snapshot too old : rollback segment number 65 with name "_SY"…

     

    에러 코드를 보니 오라클 에러인 같은데..

    처음보는 에러여서 원인을 분석해보기로 했다.

     

    ## ORA-01555 : Snapshot too old

     

    구글링을 하다보니 수행 시간이 길어서 사이 다른 Transaction 의해

    UNDO 세그먼트(롤백 세그먼트)가 덮어씌워져서 발생한 이슈라고 한다.

     

    Snapshot too old... 

    그대로 Snapshot 너무 오래 되었다는 말이란다.

     

    "

    뭔 소리야.. 그게 뭔데... 😳

    "

     

    [ + Snapshot ]

    사진을 찍듯이 특정 시간(시점)에 데이터 저장 장치(스토리지)의 파일 시스템을 포착해 별도의 파일이나 이미지로 저장, 보관하는 기술을 말한다. 

    그래서 스냅샷 기능을 이용해 데이터를 저장하면 유실된 데이터 복원과 일정 시점의 상태로 데이터를 복원할 수 있다.

     

    ✔ 특징

    ▪ 데이터 분석, 데이터 보호 및 데이터 복제와 같은 작업을 위해 수행된다.

    재해 복구와 같은 장애 상황에서도 데이터 복원을 통해 중요하다.

    긴급한 상황에서 최상의 데이터 보호 수단이 될 수 있다.

    대용량 데이터의 백업 관리를 단순화하여 운영 관리 비용을 최소화 할 수 있다.

     

    ✔ 방식

    크게 COW( Copy on Write )와 ROW( Redirect on Write ) 방식으로 나뉜다.

     

    Cow 방식은 원본 데이터에 대한 메타데이터만 활용해 스냅샷을 생성하고, 나중에 원본 데이터에 수정이 필요한 시점에 해당 데이터를 스냅샷이 저장된 스토리지 공간으로 복사한다. 이후 데이터를 수정하기 때문에 스냅샷데이터는 일관성을 유지할 수 있고, 변경된 데이터만을 저장해 스토리지 공간을 효율적으로 사용할 수 있게 된다.

     

    Row 방식은 Cow 방식에서의 I/O 과정에서발생하는 오버헤드를 줄여준다. Row 방식의 경우 스냅샷을 위한별도의스토리지 공간을 확보할 필요가 없으며, 데이터 변경이 필요한 경우 기존 데이터와 스냅샷 리스트를 고정한 채 수정된 데이터를 작성해 관리한다. 이러한 Row 방식은 두 번의 쓰기 작업이 필요해 Cow 방식(스냅샷 공간에 원본 데이터를 한 차례 삽입하고 뒤이어 수정 사항을 입력)과 달리 새로운 공간에 단 한 차례만 수정 데이터를 입력하면 되기 때문에 보다 나은 성능을 보여 준다.

     

    ✔ Snapshot 과 Backup의 차이

    Backup : 원본 데이터를 그대로 복사해 다른 곳에 저장하기 때문에 스토리지 상에 동일한 공간이 필요하다.

    Snapshot : 초기 생성 시 혹은 데이터 변경이 있기 전까지는 스토리지의 공간을 차지하지 않으며, 메타데이터의 복사본에 해당하여 생성 시간이 오래 걸리지 않고, 장애가 발행해도 빠르게 데이터를 복원할 수 있다.

     

    이렇게 찾다보니 용어에 대해 자세히 알고 있지 않는 같아,

    용어 DB 저장 구조에 대해서도 짚고 넘어가봐야겠다고 생각했다.

     

     

     

    [ORACLE] 오라클 DB의 논리적/물리적 구조 및 용어 정리

    오라클 관련 에러를 찾다보니까 DB 에 저장 구조는 어떻게 되어있는지 생각해본적이 없는 것 같더라고...?🤔 그래서! 오늘은 오라클 DB 는 어떤 구조로 되어있는지, 또 용어들에 대한 부족했던 지

    hhsit.tistory.com

     

    발생 원인

    위에서 말했듯이 ORA-01555 에러는 롤백 세그먼트에 관련된 에러이며,

    데이터 훼손이나 데이터 손실과는 관련 없는 에러이다. 

     

    에러가 발생하는 원인은 쿼리가 오랫동안 수행된다면,

    수행되는 도중 초기에 쓰여졌던 UNDO 세크먼트가 덮어씌이게 되면서,

    그 블록을 찾지 못하여 발생하는 에러이다.

     

    즉, 쿼리를 수행하는 동안 다른 Transaction들에 의해 UNDO 세그먼트(롤백 세그먼트)가 덮어씌워져서 발생한 것.

     

    발생 시나리오 by. 버터필드's Tistory

     

    [ + Undo Segment ]

    ▪ Undo

    데이터베이스의 변경사항을 롤백하거나 실행 취소하는데사용되는 정보를 생성하고 관리한다.

    이러한 정보는주로 Commit되기 전의 Transaction 작업에 대한 기록으로 구성된다.

    이전 버전에서는 Rollback Segment라고 불리기도 했다.

     

    사용 용도 : Transaction Rollback, DB 복구, 읽기 일관성 제공, Flashback 기능을 사용한 논리적 복구 등등..

     

    ▪ Undo Segment 

    Undo Segment는 실패한 Transaction을 Rollaback하고, 읽기 일관성을 제공하는데,

    이를 위해 Transaction에 대한 UNDO 정보 / UNDO 데이터를 UNDO Segment에 기록한다.

    이 UNDO Segment는 만료되거나 공간 재사용에 의해 덮어씌워질 수가 있다.

    이로 인해 해당 쿼리 결과에 대한 읽기 일관성이 유효하지 않게 되는 것이 ORA-01555 에러의 핵심이다.

     

    [ + 읽기 일관성 ]

    ▪ Session

    DB 접속을 시작으로 여러 DB에서 관련 작업을 수행한 후 접속을 종료하기까지 전체 기간을 의미한다.

    Session이 여러 개라는 말은 현재 오라클 DB에 접속하여 사용중인 연결이 여러개 있다는 뜻이다.

     

    ▪ Transaction / Session 관계

    Transaction은 데이터 조작 명령어가 모인 하나의 작업 단위를 뜻하며

    Session 내부에는 하나 이상의 Transaction이 존재한다.

     

    ▪ 읽기 일관성의 의미

    DB는 여러 사용자 또는 프로그램에서 동시에 접근되므로 대부분 수많은 Session이 동시에 연결되어 있다.

    읽기 읽관성이란 어떤 특정 Session에서 테이블의 데이터를 변경 중일 때

    그 외 다른 Session에서는 데이터의 변경이 확정되기 전까지 변경사항을 알 필요가 없으므로,

    데이터를 변경 중인 Session을 제외한 나머지 Session에서는 현재 진행 중인 변경과 무관한 본래의 데이터를 보여주는 특성을 말한다.

     

    즉, 어떤 데이터 조작이 포함된 Transaction이 종료(Commit, Rollback) 되기전까지 데이터를 직접 조작하는 Session 외 다른 Session에서는 데이터 조작 전 상태의 내용이 일관적으로 조회, 출력, 검색되는 특성을 읽기 일관성(Read Consistency) 라고 한다.

     

    DB 입장에서는 데이터를 변경하는 데이터 조작 명령어 실행 후 Commit 할지, Rollback 할지 알 수 없기 때문에 Rollback으로 명령어 수행이 취소될 경우를 대비해 변경 전 데이터를 Undo Segment에 따로 저장해둔다.

     

    [ 발생 원인 Ⅰ - Undo 기록이 만료되거나 덮어씌워지는 경우 ]

    Case 1 ) 만료

    현재  시점에서 행의 commit 시간을 뺀 시간이 UNDO_RETENTION 보다 크다는 것을 의미한다.

     

    → UNDO_RETENTION

    자동 UNDO 관리모드가 활성화되고, 지정된 수치(오라클 9i까지는 UNDO_RETENTION 파라미터의 설정 값) 동안은

    Transaction이 종료된 후에라도 관련있는 UNDO Segment를 재사용하지 못하도록 하는 기능이다.

     

    Case 2 ) Overwrite  

    UNDO 테이블스페이스가 가득 차서 'UNEXPIRED' Undo 레코드가 덮어씌워지고있는 상황이다.

    해당 UNDO 테이블스페이스에 대해 RETENTION GUARANTEE가 활성화 되지 않는다.

    쿼리를 실행하는 동안 덮어 쓰여질 가능성이 있는 크기로 Undo Segment를 설정한 상태에서 변경될 수도 있는 데이터를 그 쿼리가 엑세스할 때

     

    Case 3 ) Undo Segment가 작업량에 비해 작을 경우 / 쿼리 수행시간이 오래 걸릴 경우

    쿼리를 실행하는데 장시간이 소요되면 실행하는 동안 다른 Transaction에 의해 Rollback Segment 정보가 덮어 씌여지므로

    쿼리를 시작한 이후로 생성된 Undo 정보가 없어질 수 있다.

     

    Case 4 ) 데이터를 Fetch하는 중간중간에 Commit(Fetch Across Commit)하도록 프로그래밍 된 경우

    작업량에 비해 UNDO Segment가 작거나 쿼리 수행 시간이 오래 걸리는 것과 같은 이유로 인해 현재 쿼리를 실행하는 동안 다른 Transaction에 의해 UNDO Segment 정보가 Overwrite 되어 읽기 일관성이 유효하지 않아 발생한다.

     

    해결 방법

    Solution 1 ) 쿼리 튜닝을 통한 수행 시간 단축

    ORA-01555 에러의 핵심 원인을 방지하는 가장 최손의 방법이며 가장 먼저 시도해야 한다.ORDER BY 구문으로도 읽기 일관성을 유지시킬 수 있다.쿼리 수행 시간 단축은 더 큰 UNDO Segment에 대한 필요성을 줄여준다.

     

    Solution 2 ) 적절한 UNDO Segment 사이즈의 구성

    쿼리를 실행하는 동안 덮여 쓰여질 가능성이 있는 크기로 UNDO Segment를 설정한상태에서 변경될 수 있는 데이터를 크 쿼리가 엑세스한다면, ORA-01555 에러가 발생할 수 있다.

     

    ⇒ UNDO_RETENTION 파라미터를 적절하게 설정한다.

     

    ⇒ 수동 UNDO 관리를 사용할 때는 UNDO Segment를 늘리거나 좀 더 많은 UNDO Segment를 추가한다. (비권장..)


    Ref.

    SnapShot 관련

    https://mapoo.net/net/netstorage/%EC%8A%A4%EB%83%85%EC%83%B7%EC%9D%98-%EC%9B%90%EB%A6%AC-cow-row/

    ORA-01555 Snapshot too old 에러 원인과 해결 방법

    https://atoz-develop.tistory.com/entry/Oracle-ORA-01555-Snapshot-too-old-%EC%97%90%EB%9F%AC-%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95

    https://jungmina.com/790

    댓글

Designed by IT's H.H.