본문 바로가기

DB/Tibero

[Tibero] UNDO Data 관리

- Transaction Rollback : 데이터 변경 후 커밋을 수행하지 않은 작업을 롤백 수행하게 되면 원래 데이터로 복구되는 기능

- Read Consistency 유지 : Transaction 중 다른 세션에서는 Commit되지 않은 변경 사항을 볼 수있도록 함(Undo data 를 이용하여 Consistent Read 블록을 생성하고, 이를 조회시 사용함) 읽기 일관성을 위해서는 Query 는 시작 시점의 데이터를 기준으로 수행되어야 함. 이를 위해선 UNDO 에 해당 데이터가 유지되어야 하며, 존재하지 않을 경우 "Snapshot is too old" 에러코드(21003) 발생함.

- Flashback Query : UNDO 데이터가 존재할 경우, 과거 시점의 데이터 쿼리 가능함.

- Transaction Recovery : Transaction 진행중 네트워크 실패, Instance 실패(abort, abnormal 등의 비정상 종료 옵션 사용 및 정전 등)로 세션이 비정상 종료되는 경우 트랜잭션은 실패됨. 이러한 경우 UNDO 데이터를 이용하여 자동 복구됨.

 

• 트랜잭션이 시작되면 해당 트랜잭션은 언두 세그먼트에 할당됨.

• 데이터 변경시 변경 이전 값을 UNDO Segment 에 기록함.

• v$transaction 에서 할당된 언두 세그먼트 정보 제공.

 

• tbdown abort 등 비정상 종료시 instance crash 에 의해 실패한 트랜잭션은 재기동시 undo data 를 사용하여 자동 복구처리(롤백) 됨.

 

• 언두 데이터를 사용하여 변경 사항을 되돌리는 작업수행.

• 리두 데이터는 변경을 다시 수행하기 위해 사용.

• 리두로그는 커밋에 의해 파일에 기록되어 트랜잭션의 영속성을 보장하는 역할을 수행.

• 변경데이터가 파일에 기록되기전에 정전이나 비정상 종료에 따른 instance crash 발생시, 재기동하면 리두를 데이터파일에 적용하는 롤포워드 작업이 자동 수행되어 비정상 종료 직전의 상태로 자동복구됨.

 

언두 Extent 의 상태 정보

 Active

실행중인(커밋하지 않은) 트랜잭션을 위해 사용되며, 롤백 수행시 사용되므로, 보존되어야함

 Unexpired

트랜잭션이 종료되어 트랜잭션에서는 사용되지 않지만, UNDO_RETENTION 시간이 지나지 않은 데이터로써 읽기 일관성 모드의 데이터 액세스 및 Flashback 수행을 위해 사용될 수 있음. 다른 활성 트랜잭션 공간

 Expired

UNDO_RETENTION 기간이 만료되어서, 필요한 경우 다른 활성 트랜잭션에서 사용하는 언두세그먼트에 할당될 수 있는 Extent

 

UNDO_RETENTION 보장

 UNDO_RETENTION 기간이 만료되기전에는 익스텐트는 재활용 될 수 없음

 언두 세그먼트 공간부족시 다른 언두세그먼트의 UNDO_RETENTION 기간 만료된 익스텐트를 가져와서 재활용하게 되며, 기간 만료된 익스텐트가 없을 경우 트랜잭션은 실패하며, 다음과 같은에러 발생하게됨.

- TBR-21004: No more extent available in tablespace 'UNDO'

- TBR-21002: No more undo space available

 

 UNDO_RETENTION 측정시점

       COMMIT 시점 이후부터 측정함

 UNDO Tablespace 크기 증가

      기존 Expired 상태의 UNDO Extent 를 소모하고, 추가적으로 Active 상태의 UNDO Extent가 많아지는 경우임

 

UNDO Extent 할당 순서

1. 트랜잭션 수행을 위해 할당받은 언두 세그먼트에서 UNDO_RETENTION 기간이 만료되어 Expired 된 익스텐트를 이용함 ( UNDO TABLESPACE 사용량 증가 없음 )

2. 할당받은 언두세그먼트의 Expired 상태의 익스텐트가 없으면, 신규 익스텐트를 추가하여 사용함 ( UNDO TABLESPACE 사용량 증가됨 )

3. 다른 언두 세그먼트의 Expired 된 익스텐트를 가져와서 사용하는 언두 세그먼트의 Active 익스텐트로 이용함 ( 최소 갯수인 2개는 남겨두고, 할당해제함 )

4. UNDO 테이블스페이스가 사용하는 데이터파일의 속성이 AUTO EXTEND ON 일 경우는 RESIZE 수행됨

 

 UNDO_RETENTION

       - VT_PARAMETER 에서 파라미터 속성과 값을 조회함

       - 기본값은 900초(15분) 간 언두 데이터가 유지됨

       - UNDO 테이블스페이스는 INSTANCE 마다 다른 이름으로 설정하여야 함

          ( VT_PARAMETER view 의 GLOBAL 컬럼 값이 LOCAL 임)

 UNDO SIZE

       - V$UNDO_FREE_SPACE 뷰 : 언두 테이블스페이스에서 가용한 블록의 갯수를 보여줌

 

 DBA_ROLLBACK_SEGS

       - DBA_UNDO_SGMTS 에 대한 동의어(Synonym) 임.

 DBA_UNDO_SGMTS

       - 컬럼 항목

               -  SEGMENT_ID : ID of the segment

               -  TABLESPACE_NAME : Name of the undo tablespace

               -  FILE_ID : ID of the file containing the segment header

               -  BLOCK_ID : ID of the block containing the segment header

               -  STATUS : Status of the segment ( ONLINE , OFFLINE , UNDEFINED )

               -  RELATIVE_FNO : Relative file number of the segment header

 

 DBA_UNDO_SGMTS

       - 컬럼 항목

               -  USGMT_ID : ID of the undo segment containing the extent

               -  EXTNO : Extent number

               -  TS_ID : ID of the tablespace containing the extent

               -  TS_NAME : Name of the tablespace containing the extent

               -  FILE_ID : ID of the file containing the extent

               -  BLOCK_ID : Starting block number of the extent

               -  BYTES : Size of the extent in bytes

               -  BLOCKS : Size of the extent in blocks

               -  STATUS : Current status of the extent

               -  IS_CURRENT : Whether the extent is current extent or not

 V$ROLLSTAT

       - UNDO 사용량 통계 정보를 조회할 수 있는 뷰

 V$UNDOSTAT

       - V$UNDOSTAT 뷰를 사용하여 Undo에 대한 공간 할당과 사용을 모니터링.

       - 각 행은 10분 간격으로 인스턴스에서 수집된 통계 저장

       - 현재 작업 로드에 필요한 Undo 공간의 크기를 예측할 수 있으며 Undo 사용을 튜닝

       - 적정 크기의 UNDO 테이블스페이스 크기를 정하기 위해서는 UNDO_RETENTION, DB_BLOCK_SIZE, 그리고 초당           생성되는 UNDO BLOCK 갯수를 조회하여 계산함

 

 조회 예제

SELECT BEGIN_TIME, END_TIME, UNDO_TSNO, UNDOBLKS, TXCOUNT
FROM V$UNDOSTAT
WHERE BEGIN_TIME >= SYSDATE - (1/24);

 Undo 테이블스페이스 삭제

       - UNDO 테이블스페이스 삭제는 인스턴스에서 현재 사용되지 않을 때 , 커밋되지 않은 트랜잭션이 포함되어 있지 않             아야 가능

       - 삭제하려는 UNDO 테이블스페이스가 데이타베이스의 현재 Active한 UNDO 테이블스페이스인 경우는 먼저 새                    UNDO 테이블스페이스를 설정하여야 함

       - UNDO 테이블스페이스를 삭제하려면, 테이블스페이스내의 모든 트랜잭션이 완료되어야함

       - 예) UNDO => UNDO2 으로 UNDO_TABLESPACE 파라미터 값 변경후 다음과 같이 조회시, OFFLINE_PENDING                    으로 조회되는 것이 없어야 함(진행중인 트랜잭션이 있을 경우OFFLINE_PENDING 으로 조회됨)

 

select * from dba_undo_sgmts where status = 'OFFLINE_PENDING';