본문 바로가기

Oracle/admin

ROLLBACK SEGMENT

기존의 rollback segment를 이용하여 undo data를 관리하던 manual 형식외에 undo segment에 의하여 자동으로 관리해 주는 auto 방식도 있다.
두 가지 방식 모두를 사용할 수 있지만, undo segment를 자동으로 생성, 할당, 튜닝까지 해주는 auto 방식을 권한다.

1) UNDO SEGMENT의 개념
• UNDO SEGMENT는 Data의 변경사항, 즉 transaction이 data를 수정하기 전의 값을 저장함으로써 언제든지 기존의 data로 recovery시키는 역할을 한다.
• 즉, 내부적으로 UNDO SEGMENT는 변경전 data에 대한 값과 위치 값인 File ID, BLOCK ID, 등의 정보를 담고 있다.
• 이러한 UNDO 기능 외에도 사용자에게 READ-consistency(읽기 일관성)를 제공하는 기능도 가지고 있다.
• 또한 UNDO SEGMENT는 여러 개의 transaction 변경 정보를 기록할 수 있다. 즉, 하나의 UNDO SEGMENT를 여러 개의 transaction이 동시에 사용할 수 있으며, 이 때 저장되는 기본 단위는 BLOCK 단위이다.

2) UNDO SEGMENT의 기능

 a) transaction rollback
 b) transaction recovery
 c) READ-consistency(읽기 일관성)

3) UNDO SEGMENT의 종류

 a) SYSTEM UNDO SEGMENT
 b) NON-SYSTEM UNDO SEGMENT
 c) DEFERRED UNDO SEGMENT 

4) 사용중인 UNDO SEGMENT의 확인

 a) SQL> SHOW PARAMETER undo_management;로 확인
 b) DBA_ROLLBACK_SEGS 뷰를 사용하여 확인
SQL> SHOW PARAMETER undo_management;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO

SQL> SELECT segment_name,tablespace_name FROM dba_rollback_segs;
 
SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
SYSTEM                         SYSTEM
_SYSSMU1$                      UNDOTBS1
_SYSSMU2$                      UNDOTBS1
_SYSSMU3$                      UNDOTBS1
_SYSSMU4$                      UNDOTBS1
_SYSSMU5$                      UNDOTBS1
_SYSSMU6$                      UNDOTBS1
_SYSSMU7$                      UNDOTBS1
_SYSSMU8$                      UNDOTBS1
_SYSSMU9$                      UNDOTBS1
_SYSSMU10$                     UNDOTBS1
 
11 rows selected.
 
SQL>

UNDO SEGMENT 관리

관리자가 UNDO tablespace를 생성해 주고 몇 파라미터만 설정해 주면 server가 undo segment에 대한 관리를 모두 자동으로 한다.
Automatic UNDO management를 위하여 설정해야 할 파라미터는 다음과 같다.

 
 	UNDO_MANAGEMENT=AUTO
	UNDO_TABLESPACE=tablespace명

UNDO_TABLESPACE는 UNDO data를 관리할 tablespace를 지정해 주는 파라미터로 초기화 파리미터 파일 init<SID>.ora에서 정해 주거나 시스템 기동중에 ALTER SYSTEM SET 문을 사용하여 설정해 줄 수 도 있다.

	SQL> ALTER SYSTEM SET undo_tablespace= undotbs1;

1) Automatic Undo Management

 a) AUTOMATIC UNDO tablespace의 생성
 b) UNDO Tablespace의 변경과 switching
 c) UNDO Tablespace의 삭제

2) Manual Undo Management

a) ROLLBACK SEGMENT의 생성

【형식】
	CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment명
	[TABLESPACE tablespace명]
	[STORAGE ([INITIAL 크기 [K|M] ]
          [NEXT 크기 [K|M] ]
          [MINEXTENTS 크기 ]
          [MAXEXTENTS 크기 | UNLIMITED ]
          [OPTIMAL {크기 [K|M] NULL} ] )

여기서 OPTIMAL의 의미는 ROLLBACK SEGMENT가 MAXEXTENTS로 지정된 크기까지 증가하여 사용된 후, 사용이 완료되면 OPTIMAL에서 지정한 크기로 ROLLBACK SEGMENT가 자동으로 줄어들게 된다.

-- 생성시 PUBLIC 또는 PRIVATE로 지정할 수 있으나 이 후에는 변경이 불가하다.(기본값=PRIVATE)
-- MINEXTENTS는 2이상이어야 함
-- PCTINCREASE는 지정하지 않는다.
-- OPTIMAL은 MINEXTENTS보다 크거나 같아야 한다.

b) ROLLBACK SEGMENT의 ONLINE(활성화)
새로 만든 rollback segment는 offline 상태 이므로 online 상태로 변경해야 한다.
online 상태로 변경하는 두 가지 방법

 방법1: parameter file을 수정하여 항상 online 상태로 하는 방법
       ROLLBACK_SEGMENT=(Online시킬 rollback_segment명)
 방법2: ALTER ROLLBACK SEGMENT rollback_segment명 ONLINE;에 의한 방법
        --이 방법은 현재의 session에서만 online상태로 됨

c) ROLLBACK SEGMENT의 OFFLINE(비활성화)
online상태를 offline 상태로 변경하는 방법은 활성화 방법의 역으로 두가지 방법이 있다.

 방법1: parameter file을 #으로 주석처리한다음 INSTANCE를 재시작 한다.
       #ROLLBACK_SEGMENT=(Online시킬 rollback_segment명)

 방법2: ALTER ROLLBACK SEGMENT rollback_segment명 OFFLINE;에 의한 방법
         --이 방법은 현재의 session에서만 offline상태로 됨

d) ROLLBACK SEGMENT의 할당
방법1) Oracle Server가 자동으로 ROLLBACK SEGMENT를 검사하여 할당하거나,
방법2) transaction에 특정 ROLLBACK SEGMENT를 지정할 수 도 있다.

     SQL> SET TRANSACTION USE ROLLBACK SEGMENT 지정할 ROLLBACK_SEGMENT명;

e) ROLLBACK SEGMENT의 STORAGE 변경
다음과 같은 형식을 사용하여 storage 절을 변경할 수 있다.


	ALTER ROLLBACK SEGMENT rollback_segment명
	STORAGE ( [NEXT 정수 [K|M] ]
          [MINEXTENTS 정수 ]
          [MAXEXTENTS 정수 | UNLIMITED ]
          [OPTIMAL {정수 [K|M] NULL} ] )

-- INITIAL 값은 수정할 수 없기 때문에 이를 변경하려면, ROLLBACK SEGMENT를 삭제후 다시 생성한다.

f) ROLLBACK SEGMENT의 성장
--transaction이 쓰기를 계속하여 현재 할당된 EXTENT를 모두 채우면 Oracle은 바로 다음 ROLLBACK SEGMENT의 EXTENT가 비활성화 인지 확인한다.
-- 다음 EXTENT가 비활성화 되어 있는 경우 transaction은 다음 EXTENT를 활성화 시키고 쓰기를 계속한다. 그러나 다음 EXTENT가 활성화 되어 있고 transaction의 데이터가 들어 있어 사용할 수 없으면 oracle은 그 다음 또는 다른 비활성화 되어 있는 EXTENT가 있더라도 새로운 EXTENT를 할당하여 사용한다
-- Oracle은 EXTENT 수가 MAXEXTENTS parameter에 설정된 값에 도달할 때까지 ROLLBACK SEGMENT에 새로운 EXTENT를 할당한다.

그림에서 가득찬 4번 EXTENT가 빈 EXTENT를 찾기 위하여 1번 EXTENT를 확인했으나, 다른 transaction이 사용중인 활성화 상태인 것을 확인한 후 오른쪽 그림처럼 4번 EXTENT 자리에 새로운 EXTENT인 5번을 추가로 할당한다. 이때 2번 EXTENT의 상태가 비어 있는 비활성화 상태라 할지라도 1번 EXTENT를 건너 뛰어 할당 할 수 없다.

1번 EXTENT가 계속 활성화 상태라면 MAXEXTENTS에 지정한 크기까지 계속해서 EXTENT가 증가되어 할당 된다. 결국 transaction이 종료되기 전까지는 계속해서 EXTENT를 할당하여 MAXEXTENTS로 지정된 크기까지 계속해서 증가된다.
한 개의 transaction 때문에 전체 EXTENT의 크기가 증가한다면, 공간 활용면에서 비효율적이며, 이것을 방지하기 위하여 database 관리자는 모니터링을 통해서 사용자에게 알린 후 transaction을 강제로 종료시켜야 한다.

g) EXTENT 할당 해제
ROLLBACK SEGMENT에 OPTIMAL 값이 지정되어 있지 않은 경우, 다음과 같이 사용자의 ROLLBACK SEGMENT의 EXTENT를 해제할 수 있다.

	ALTER ROLLBACK SEGMENT rollback_segment명
	SHRINK [TO 정수 [K|M]];

-- 여기서 '정수'를 지정하지 않으면 OPTIMAL에서 지정한 값까지 할당을 해제한다.

h) SNAPSHOT TOO OLD
ROLLBACK SEGMENT와 관련된 error메시지로 transaction이 종료되고 비활성화 상태에 있는 EXTENT는 할당해제되어 다른 transaction에게 주어진다.
이 때 재사용될 가능성이 낮은 EXTENT는 나중에 회수되는데, 회수된 EXTENT는 다른 transaction에 의해 새로운 값이 overwrite된다.
그러나 사용자가 transaction을 취소하여 ROLLBACK 정보를 요구했는데, 그 transaction은 이미 종료되고 다른 transaction의 정보가 기록되거나 또는 oracle server에 의해서 회수된 상태라면 oracle server는 찾는 정보가 없는 것을 확인하고 보내는 메시지이다.

i) ROLLBACK SEGMENT의 삭제
ROLLBACK SEGMENT를 삭제하기 위해서 다음과 같이 한다.

	DROP ROLLBACK SEGMENT rollback_segment명;

-- ROLLBACK SEGMENT는 offline 상태에서만 삭제된다.

【예제】
SQL> sqlplus '/as sysdba'
SQL> column tablespace_name format a10;
SQL> select tablespace_name,initial_extent,next_extent,min_extents,
  2  max_extents from dba_rollback_segs;
 
TABLESPACE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
---------- -------------- ----------- ----------- -----------
SYSTEM             114688                       1       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
UNDOTBS1           131072                       2       32765
 
12 rows selected.
 
SQL> select segment_name,status from dba_rollback_segs;
 
SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU1$                      ONLINE
_SYSSMU2$                      ONLINE
_SYSSMU3$                      ONLINE
_SYSSMU4$                      ONLINE
_SYSSMU5$                      ONLINE
_SYSSMU6$                      ONLINE
_SYSSMU7$                      ONLINE
_SYSSMU8$                      ONLINE
_SYSSMU9$                      ONLINE
_SYSSMU10$                     ONLINE
_SYSSMU22$                     ONLINE
 
12 rows selected.
 
SQL> column file_name format a60;
SQL> column tablespace_name format a15;
SQL> select tablespace_name,file_name from dba_data_files;
 
TABLESPACE FILE_NAME
--------------- ------------------------------------------------------------
USERS           /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX          /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1        /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM          /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
 
SQL>
SQL> create tablespace rollback_tab1
  2  datafile '/export/home/oracle/app/oracle/oradata/orcl/rbtbs01.dbf' size 1M;
 
Tablespace created.
 
SQL> create tablespace rollback_tab2
  2  datafile '/export/home/oracle/app/oracle/oradata/orcl/rbtbs02.dbf' size 1M;
 
Tablespace created.
 
SQL> select tablespace_name,file_name from dba_data_files;
 
TABLESPACE_NAME FILE_NAME
--------------- ------------------------------------------------------------
USERS           /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX          /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1        /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM          /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
ROLLBACK_TAB1   /export/home/oracle/app/oracle/oradata/orcl/rbtbs01.dbf
ROLLBACK_TAB2   /export/home/oracle/app/oracle/oradata/orcl/rbtbs02.dbf
 
6 rows selected.
 
SQL> select tablespace_name,initial_extent,next_extent,min_extents,max_extents
  2  FROM dba_rollback_segs;
 
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
--------------- -------------- ----------- ----------- -----------
SYSTEM                  114688                       1       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
UNDOTBS1                131072                       2       32765
 
12 rows selected.
 
SQL> create rollback segment rollback1;
 
Rollback segment created.
 
SQL> create rollback segment rollback2
  2  tablespace rollback_tab2
  3  storage (initial 40k
  4           next 40k
  5           minextents 20
  6           maxextents 505
  7           optimal 800k);
 
Rollback segment created.
 
SQL> alter rollback segment rollback2 ONLINE;
 
Rollback segment altered.

SQL> set transaction use rollback segment rollback2;
 
Transaction set.
 
SQL> select segment_name,status from dba_rollback_segs;
 
SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU1$                      ONLINE
_SYSSMU2$                      ONLINE
_SYSSMU3$                      ONLINE
_SYSSMU4$                      ONLINE
_SYSSMU5$                      ONLINE
_SYSSMU6$                      ONLINE
_SYSSMU7$                      ONLINE
_SYSSMU8$                      ONLINE
_SYSSMU9$                      ONLINE
_SYSSMU10$                     ONLINE
_SYSSMU22$                     ONLINE
 
12 rows selected.
 
SQL> alter rollback segment rollback1
  2  storage(minextents 15 maxextents 600);
 
Rollback segment altered.
 
SQL> alter rollback segment rollback1
  2  SHRINK;
 
Rollback segment altered.
 
SQL> drop rollback segment rollback2;
 
Rollback segment dropped.
 
SQL> drop rollback segment rollback1;
 
Rollback segment dropped.
 
SQL> drop tablespace rollback_tab1 including contents and datafiles;
 
Tablespace dropped.
 
SQL> drop tablespace rollback_tab2 including contents and datafiles;
 
Tablespace dropped.
 
SQL> select tablespace_name,file_name from dba_data_files;
 
TABLESPACE_NAME FILE_NAME
--------------- ------------------------------------------------------------
USERS           /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX          /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1        /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM          /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
 
SQL>

rollback segment의 정보 조회

v$rollname롤백세그먼트의 통계치에 관한 정보 조회
v$rollstat롤백세그먼트의 통계치에 관한 정보 조회
dba_rollback_segs롤백세그먼트의 저장 정보와 상태 정보
v$session세션에 관한 정보
v$transaction트랜젝션에 관한 정보


 

'Oracle > admin' 카테고리의 다른 글

Oracle Enterprise Manager(EM) 한글 깨짐 해결  (0) 2015.09.14
TEMP 테이블스페이스 생성 및 삭제  (0) 2015.09.14
Shared Server 구성  (0) 2015.09.14
특정 session kill  (0) 2015.09.14
유용한 dictionary  (0) 2015.09.14