UNDO 관리
SQL> show parameter undo
undo_management : AUTO
-
UNDO SEGMENT의 개수와 사이즈를 오라클이 알아서 정하겠다.
-
DBA가 할 일은 언두 전용 테이블스페이스(UNDO_TABLESPACE) 만들기만 하면 된다(사이즈 설정을 어떻게 할 것인지가 중요).
undo_tablespace : UNDOTBS1
-
undo_tablespace 파라미터가 가리키는 값이 지정된 언두 테이블스페이스이다.
-
언두 테이블스페이스는 추가로 더 생성 가능하지만, 사용하는 테이블스페이스는 한개이다.
*그럼 왜 추가로 더 만드는 거지?
크기, 성능이 더 좋은 새로운 (언두) 테이블스페이스로 옮기고(switch) 싶어서.
→ switch 할 때 사용중이던 테이블스페이스에서 하던 작업들은 계속 진행됨(아직 완료되지 않은 트랜잭션 계속 진행)
→ 완료되면 자동 삭제됨
undo_retention : 900(초)
-
commit 후 언두를 보존하는 시간
-
flashback query를 위해 지켜져야 한다.
-
undo_retention이 크면 undo도 커져야 한다. → 보존해야 하는 undo의 양이 늘어나기 때문에.
-
status : ACTIVE → UNEXPIRED → EXPIRED
-
공간이 부족하면 undo_retention은 지켜지지 않는다.
*하지만 undo_retention이 반드시 지켜지는 경우가 있다.
① Undo datafile이 autoextend on 상태일 때
② 언두 테이블스페이스의 RETENTION이 GUARANTEE 상태일 때
select tablespace_name, allocation_type, segment_space_management, contents, retention
from dba_tablespaces
where contents='UNDO';
UNDO RETENTION은 다음 명령어로 변경할 수 있다.
alter tablespace undotbs1 retention guarantee;
UNDO의 용도
① rollback - 트랜잭션 실행 중 rollback 하면 변경 전 데이터를 가져오기 위해서 언두가 필요하다.
② 읽기 일관성 지원
③ 실패한 트랜잭션의 recovery - 서버 프로세스가 죽었을 때 PMON이 복구(rollback)할 경우, instance recovery의 rollforward 후 rollback 할 경우.
④ flashback - 과거의 특정 시점으로 돌아가기 위해 언두가 필요하다.
트랜잭션과 언두 데이터(undo segment)
• undo extent 최소 2개로 시작한다.
• undo extent를 계속 돌려쓴다.
*새로운 extent를 할당하려면 사용 안한지 제일 오래된 extent로 가서,
- 거기에 존재하는 트랜잭션이 모두 commit 되어 EXPIRED 상태면 재사용(OVERWRITE) 한다.
- 하지만 ACTIVE 상태가 하나라도 있으면 재사용 못하고 새로운 extent를 할당한다.
• 각 트랜잭션은 하나의 언두 세그먼트에만 할당된다
• 하나의 언두 세그먼트는 한 번에 여러 개의 트랜잭션 처리가 가능하다.
• 언두 세그먼트와 익스텐트의 관계
select segment_name, sum(bytes)/1024 k, count(extent_id) -- count(extent_id) = extent 개수
from dba_undo_extents
group by segment_name;
'ORACLE > ADMIN' 카테고리의 다른 글
Oracle 네트워크 설정 방식(client-side) (0) | 2020.07.28 |
---|---|
Oracle Listener 구성(정적등록vs동적등록) (0) | 2020.07.28 |
Oracle redo log file, control file 다중화 (0) | 2020.07.20 |
Oracle User 유저 생성 (2) | 2020.07.19 |
Oracle Tablespace 테이블스페이스 생성 (0) | 2020.07.18 |