- 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';
'DB > Tibero' 카테고리의 다른 글
[Tibero] 티베로 라이선스 정책 (0) | 2023.07.26 |
---|---|
[Tibero] Tibero 패치 (0) | 2023.07.26 |
[Tibero] DATAFILE 유실 시 대처 방법(NOARCHIVELOG) (0) | 2023.07.11 |
[Tibero] Oracle -> Tibero DB link 방법 (0) | 2023.06.07 |
[Tibero] PHP 연동법(Apache설치 후 php사용하게 설정) (0) | 2023.05.30 |