Enq: US - contention 란 ? 트랜잭션의 양이 빠른 속도로 증가해서 기존에 사용하던
언두 세그먼트만으로는 트랜잭션을 감당할 수 없을 때
새로운 오프라인 상태의 언두 세그먼트를 온라인 시키거나 새로운 언두 세그먼트를 생성한다.
이처럼 언두 세그먼트를 온라인 또는 오프라인시키는 과정을 동기화하기 위해 해당 작업을 수행하는
서버 프로세스나 백그라운드 프로세스는 US 락을 획득 해야 한다.
( 출처 - http://wiki.ex-em.com/index.php/Enq:US-_contention )
조치 - 한번 Online 된 언두 세그먼트를 Offline 시키지 않도록 설정
-- init.ora file 에 event 설정방법
event="10511 trace name context forever, level 1"
-- ordebug 를 이용한 설정방법
SQL> conn /as sysdba
Connected.
SQL> oradebug setospid 6765
Oracle pid: 8, Unix process pid: 6765, image: oracle@teng.com (SMON)
SQL> oradebug event 10511 trace name context forever, level 1
Statement processed.
SQL> oradebug setmypid
Statement processed.
-- 위와 같은 방법의 제약은 오라클을 재기동할 경우에는 1개의 인스턴스에 10개를 제외한
-- 모든 언두 세그먼트들은 다시 Offline 된다는 것이다.
-- 따라서 아래와 같은 방법을 이용하여 오라클 재기동 직후에 모든 언두 세그먼트를 수동으로 online 시키는 것이 가능하다.
alter system set "_smu_debug_mode"=4 ;
alter rollback segment <segment_name> online ;
alter system set "_smu_debug_mode"=0 ;
: 하나의 언두 세그먼트 당 허용 하는 트랙잭션 개수는 잘못된 사실
데이터베이스 기동 시에 온라인 시킬 Public 언두 세그먼트의 개수를 정의
-- r01 ~ r10까지 10개의 private 언두 세그먼트 생성
SQL> create rollback segment r01 .... ;
...
SQL> create rollback segment r10 .... ;
-- p01 ~ p10까지 10개의 public 언두 세그먼트 생성
SQL> create public rollback segment p01 .... ;
...
SQL> create public rollback segment p10 .... ;
-- 초기화 파라미터
rollback_segments= (r01,r02,r03,r04,r05,r06,r07, r08, r09,r10);
transactions = 60
transaction_per_rollback_segments = 4
이와 같이 설정하려면 transaction / transaction_per_rollback_segments = 15 이다.
즉 15개의 언두 세그먼트가 필요하다고 인식하고 있으므로,
10개의 private 언두 세그먼트와 더불어 5개의 public 언두 세그먼트(p01~p05)를
자동으로 온라인 시키게 된다. 이러한 경우 public 언두 세그먼트가 존재 하지 않더라도,에러 없이 DB는 기동된다.
Public 언두 세그먼트는 Private 언두 세그먼트와 동일하게 동작한다.
단. OPS나 RAC 환경에서 private 언두 세그먼트는 특정 노드에서만 사용이 가능하지만,
public 언두 세그먼트는 사용 노드의 변경이 가능하다.
( private undo segment 는 rollback_segments 에 등록 시에만 사용 가능 )
( 일반적으로 public 하게 생성 하여 운영 )
다.1. UNDO_MANAGMENT
AUM(Default) / MUM, 변경시 DB Restart 필요, RAC 환경에선 인스턴스간 동일 설정 필요
다.2. UNDO_TABLESPACE
AUM 환경에서, UNDO 저장을 위한 TABLESPACE 지정, RAC 환경에선 인스턴스별 설정 필요
다.3. UNDO_RETNETION
900초(Default)
LOB 은 지원 하지 않는다. DBA_LOBS.RETENTION
[ 충분한 공간이 확보 되어야 UNDO_RETENTION 이 지켜짐 ,
충분한 공간이 확보 되지 않는 경우, Unexpired Undo Space 가 재사용됌 ==> snapshot too old 발생 ]
현재 DB 에서 유지 중인 RETENTION 값 확인 ==> V$UNDOSTAT.TUNED_UNDORETENTION
FLASHBACK 과 관련 깊은 파라미터
라.1. Undo Tablespace 갯수
Instance 당 하나 ( 여러 개 존재 가능 )
라.2. Undo Tablespace 변경
[ Dynamic 하게 변경 가능 ( ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS2 ; )
라.3. Undo Shrink
불가능, Undo Tablespace Change 만 가능함
라.4. Automatic Undo Retention
10g 부터 Enable 됌
라.5. Guarantee DBA_TABLESPACES.RETENTION
Alter tablespace UNDOTBS2 retention gurantee ;
Alter tablespace UNDOTBS2 retention nogurantee ;