Tablespace와 Datafile 관리하기.


1.Undo Tablespace

- Undo Data : 사용자가 DML을  수행할 경우 발생하는 원본데이터.

- Undo Segment: Undo Data만 저장하는 Segment

- Undo Tablespace: Undo Segment를 저장하는 Tablespace

                                Undo Data만 저장 가능하며, Oracle Server process가 직접관리한다.


1-1) Undo Tablespace의 특징.

- Oracle server process는 이 테이블 스페이스에 Undo Segment를 생성하고 각 사용자별로 Undo Segment를 할당하여 undo data를 관리하며 사용자는 관여할 수 없다.

- Undo Tablespace는 Instance당 여러 개가 존재할 수 있으나, 사용되는것은 한번에 1개뿐.

- 관리방법으로는 자동 모드와 수동 모드가 있으며, 9i버젼부터 Automatic Undo Management(AUM)을 권장한다.

사용하기 위해서는 초기화 파라미터 파일에 Undo_management = auto로 설정하고 수동 mode 관리를 위해서는 manual로 설정하면된다.

- 자동모드가 기본이며, manual값은 주로 장애가 발생될 경우 복구용도로 사용된다. 변경 후 적용을 위해서는 Instance를 재기동 해야한다.


SYS@PROD>show parameter undo

 

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management      string AUTO

undo_retention     integer 900

undo_tablespace      string UNDOTBS1


1-2) Undo Tablespace의 사용목적.

- Transaction Rollback : 사용자가 Rollback 명령어를 사용하면, 이곳에 저장된 Undo Data를 사용하여 Rollback 수행.

- Read Consistency : CR 작업을 통해 트랜잭션이 끝나지 않은 데이터는 변경 전 데이터를 보여준다.

* CR 작업 : 1. 데이터를 DB Buffer Cache로 복사

                  2. Redo Log Buffer에 변경내용기록

                  3. Undo Segment에 기록

                  4. DB Buffer cache의 원본 변경


*읽기 일관성 실습

- 터미널 1에서 EMPNO 7369의 이름을 GOOD BOY로 변경

  DB BUFFER CACHE에 이름이 변경되고, LOCK이 설정되어 터미널1에서 COMMIT 이나 ROLLBACK 수행 전까지는 터미널2에서 변경된 데이터를 볼 수 없음.

- 터미널 2에서 변경된 데이터에 대한 조회를 수행

  사용자의 SERVER PROCESS는 UNDO에 있는 데이터를 DB BUFFER CACHE로 복사해서 사용자에게 제공


 터미널 1

터미널2 

SCOTT@PROD> 

select EMPNO, ENAME from EMP;

 

     EMPNO ENAME

---------- ----------

      7369 HELLO

      7499 ALLEN

      7521 WARD

      7566 JONES

      7654 MARTIN

      7698 BLAKE

      7782 CLARK

      7788 SCOTT

      7839 KING

      7844 TURNER

      7876 ADAMS

      7900 JAMES

      7902 FORD

      7934 MILLER



 

 SCOTT@PROD>

      UPDATE EMP 

      SET ENAME ='GOODBOY'

      WHERE EMPNO=7369;

 

 

 SCOTT@PROD>

select EMPNO, ENAME from EMP;

 

     EMPNO ENAME

---------- ----------

      7369 GOODBOY

      7499 ALLEN

      7521 WARD

      7566 JONES

      7654 MARTIN

      7698 BLAKE

      7782 CLARK

      7788 SCOTT

      7839 KING

      7844 TURNER

      7876 ADAMS

      7900 JAMES

      7902 FORD

      7934 MILLER

 SCOTT@PROD>

select EMPNO, ENAME from EMP;

 

     EMPNO ENAME

---------- ----------

      7369 HELLO

      7499 ALLEN

      7521 WARD

      7566 JONES

      7654 MARTIN

      7698 BLAKE

      7782 CLARK

      7788 SCOTT

      7839 KING

      7844 TURNER

      7876 ADAMS

      7900 JAMES

      7902 FORD

      7934 MILLER

SCOTT@PROD> COMMIT;

 

SCOTT@PROD>

select EMPNO, ENAME from EMP;

 

     EMPNO ENAME

---------- ----------

      7369 GOODBOY

      7499 ALLEN

      7521 WARD

      7566 JONES

      7654 MARTIN

      7698 BLAKE

      7782 CLARK

      7788 SCOTT

      7839 KING

      7844 TURNER

      7876 ADAMS

      7900 JAMES

      7902 FORD

      7934 MILLER 

SCOTT@PROD>

select EMPNO, ENAME from EMP;

 

     EMPNO ENAME

---------- ----------

      7369 GOODBOY

      7499 ALLEN

      7521 WARD

      7566 JONES

      7654 MARTIN

      7698 BLAKE

      7782 CLARK

      7788 SCOTT

      7839 KING

      7844 TURNER

      7876 ADAMS

      7900 JAMES

      7902 FORD

      7934 MILLER

 


- Transaction Recovery (Instance Recovery라고도함)

운영중인 DB서버가 비정상적으로 종료가 되었을 때 Roll Forward와 Roll back 작업을 수행해서 Dirty database를 Clean Database로 만들어주는 과정에서 Undo Data 사용


1-3) Undo Segment 할당되는 원리

- Undo Tablespace의 특징 중 하나는 Undo Data File의 크기가 증가만 되고 줄어들지는 않는다.



 

- Undo Tablespace 안에 4개의 Undo Segment 가 할당되어 있다.






- E라는 사용자가 신규접속하여 DML을 수행할 경우 E 사용자의 Server Process는 가장먼저 Undo Segment를 할당받게된다.

 기존에 만들어져 있던 Segment 중 트랜잭션이 완료된것이 있는지를 우선적으로 확인 후, 그시점에 A가 Commit 을 수행하여 트랜잭션이 끝났다면, A가 사용했던 Undo Segement를 덮어쓰게된다.




 

- F 라는 사용자가 접속하여, DML을 수행하려하는데 Commit 이나 Rollback을 수행하지 않아서 트랜잭션이 완료된게 없는 경우 새로운 Undo Segment를 하나 더 생성해서 기록한다.


- Undo Segment가 Data file의 저장공간이 허용하는 범위까지 늘어나다가 Data File에 더 공간이 없게되면 하나의 Segment에 두개 세션이상의 Undo Data를 함께 기록하다가 그 조차도 공간이 없으면 해당 트랜잭션은 에러가나게됨.


* Undo Data가 늘어나도 늘어난 데이터파일의 크기를 줄일 수는 없다. Commit을 수행해도 Undo Segment안에 Undo Data는 지워지지 않고 남아있기 때문. 

* Commit 수행 시 다른 서버 프로세스가 덮어 쓸 수 있게 해주는 것일 뿐 Undo Segment 안의 자료를 지우는것은 아니다.

* Undo Tablespace 크기가 비정상적으로 클 경우에는 관리자가 다른 작은 Undo Tablespace를 신규로 만들고, Undo Tablespace를 신규 Undo Tablespace로 변경시킨 후 기존 Undo Tablespace를 삭제해 주어야한다.





1-4) Undo tablespace 변경하기.


1. Undo 상태확인.

SYS@PROD>show parameter undo;

 

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management      string AUTO

undo_retention     integer 900

undo_tablespace      string UNDOTBS1


=> 현재 인스턴스의 Undo tablespace 는 UNDOTBS1로 지정되어 있다.


2. 신규 Undo Tablespace  생성

SYS@PROD>create undo tablespace undo01

  datafile '/u01/app/oracle/oradata/PROD/undo01.dbf' size 10M

  autoextend on;


3. 현재 Tablespace 목록 확인

TABLESPACE   MB FILE_NAME  AUT ONLINE_

---------- ---------- -------------------------------------------------- --- -------

SYSTEM   400 /home/oracle/systemdest/system01.dbf NO  SYSTEM

SYSAUX   200 /u01/app/oracle/oradata/PROD/sysaux01.dbf  NO  ONLINE

UNDOTBS1   200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO  ONLINE

USERS   50 /u01/app/oracle/oradata/PROD/users01.dbf NO  ONLINE

EXAMPLE   100 /u01/app/oracle/oradata/PROD/example01.dbf NO  ONLINE

UNDO01   10 /u01/app/oracle/oradata/PROD/undo01.dbf YES ONLINE

 

6 rows selected.

=> UNDO01 Tablespace가 생성됨.


4. 새로 생성한 Undo Tablespace로 변경

 

SYS@PROD>alter system set undo_tablespace=undo01;


=> Pfile인 경우 이 작업 이후 파라미터파일의 내용도 변경해야 DB 재시작 후 장애가 없음.

(작업환경은 SPFILE  사용)


** 참고(value에 경로 없을경우 SPFILE 사용 경로 있을 경우 Pfile사용)

SYS@PROD>show parameter pfile

 

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

spfile     string



5. 변경된 Undo Tablespace 확인.

SYS@PROD>show parameter undo

 

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management      string AUTO

undo_retention     integer 900

undo_tablespace      string UNDO01


 

1-5) Undo 사용세션 확인.


 1) 확인스크립트

select s.sid, s.serial#, s.username, r.name "ROLLBACK SEG"

from v$session s, v$transaction t, v$rollname r

where s.taddr=t.addr

and t.xidusn=r.usn;


 2) 실습

 터미널1 (SYS 계정)

터미널 2 (SCOTT 계정)

SYS@PROD>@undo_ses

 

no rows selected 

 

 

 SCOTT@PROD>update emp

    set job='DBA'

    where empno=7369;

 

1 row updated.

SYS@PROD>@undo_status

       SID    SERIAL# USERNAME       USED_UREC  USED_UBLK

---------- ---------- ------------------------------ ---------- ----------

34   93 SCOTT       1  1

 

 

 

 SCOTT@PROD>update emp

     set JOB='ADMIN'

     where empno=7499  ;

SYS@PROD>@undo_status

 

       SID    SERIAL# USERNAME       USED_UREC  USED_UBLK

---------- ---------- ------------------------------ ---------- ----------

34   93 SCOTT       2  1 

 

 

 SCOTT@PROD> commit;

 SYS@PROD>@undo_ses

 

no rows selected

 

 


* 추가 테스트 1. 다른 세션에서 SCOTT 계정으로 변경작업을 시도할 경우

 

 

       SID    SERIAL# USERNAME       USED_UREC  USED_UBLK

---------- ---------- ------------------------------ ---------- ----------

45   60 SCOTT       1  1

34   93 SCOTT       3  1

32   103 SCOTT       1  1

 


* 추가 테스트 2. SID 34 세션에서 Commit 이나 Rollback을 수행하지 않고 종료할 경우

 

 

       SID    SERIAL# USERNAME       USED_UREC  USED_UBLK

---------- ---------- ------------------------------ ---------- ----------

45   60 SCOTT       1  1

32   103 SCOTT       1  1

 




1-6) Undo 관련 주요 파라미터.

- UNDO_RETENTION(초단위)

 COMMIT 수행 후에도 해당 UNDO SEGMENT 내의 데이터를 다른 서버 프로세스가 덮어 쓰지 못하도록 막아주는 시간.

 그러나, Undo segment 여분이 있을 경우에만 적용되며, 만약 모든Undo Segment가 사용중일 경우에는 적용되지않는다.

  * ORA-01555. Snapshot too old

사용자 A: 1시간정도 수행되는 특정 데이터의 집계작업을 수행중

사용자 B: 사용자A가 집계중인 데이터를 update 한 후 commit할 경우 

사용자 A: 사용자 B가 변경전의 데이터를 Undo Segment에서 찾아서 집계하게됨.

               만약 B가 Commit 한 후 사용자 C가 사용자 B의  Undo Segment를 덮어 썻다면 사용자 A는 집계쿼리를                완성할 수 없고. 이때 발생하는 에러가 Snap shot too old Error 이다.


- UNDO_RETENTION_GURANTEE

 UNDO_RETENTION이란 파라미터는 UNDO SEGMENT양이 부족하면 설정된 시간이 무시되고 UNDO SEGMENT가 재사용되지만, UNDO_RETENTION_GURANTEE 파라미터를 설정하면, 설정된 시간동안 재활용을 하지않고 지켜준다.

 * 이 기능을 사용할 경우 COMMIT을 수행해도 UNDO SEGMENT를 특정 시간동안 재사용 하지 않음으로써, UNDO TABLESPACE의 용량이 증가될 수 있기 때문에 기본값은 NOGURANTEE 이다.


 SYS@PROD>select tablespace_name, retention from dba_tablespaces;

 

TABLESPACE_NAME        RETENTION

------------------------------ -----------

SYSTEM       NOT APPLY

SYSAUX       NOT APPLY

UNDOTBS1       NOGUARANTEE

TEMP       NOT APPLY

USERS       NOT APPLY

EXAMPLE        NOT APPLY

UNDO01       NOGUARANTEE