ORACLE/ADMIN

LOB SEGMENT 관리

argoLee 2017. 7. 25. 20:57

일반 테이블의 lob segment 관리.

-       Lob 컬럼이 존재하는 table을 옮기고자 할때는 테이블만을 옮긴다고 해서 lob column까지 옮겨지는 것은 아니다. Lob column의 테이블 스페이스와 테이블의 테이블스페이스는 별개로 생각해야한다.  


아래와 같은 CLOB을 가지는 테이블이 있다고 하자.

 

 

Lob 테이블 생성

CREATE TABLE  DTXGCD

(

             DTXGCD_SQ        NUMBER NOT NULL,

             DTXGCD_BRND_NM   VARCHAR2 (50),

             DTXGCD_ADTK_URL  VARCHAR2 (255),

             DTXGCD_BRF_BNFT_IF VARCHAR2 (512),

             DTXGCD_DTL_BNFT_IF CLOB

)

tablespace pak

pctfree 10

INITRANS 1

MAXTRANS 255

STORAGE

(

             INITIAL 5M

             MINEXTENTS 1

             MAXEXTENTS UNLIMITED

             BUFFER_POOL DEFAULT

)

lob (DTXGCD_DTL_BNFT_IF) store as L_DTXGCD_DTL_BNFT_IF

(

tablespace pak storage(initial 3M)

index X_DTXGCD_DTL_BNFT_IF (tablespace pak_idx storage(initial 1M)

));

insert into DTXGCD values(1,'a','a','a','a');

 

 

생성구문을 자세히 보면 테이블 DTXGCD PAK테이블 스페이스에 생성하였고DTXGCD_DTL_BNFT_IF이름의 

CLOB컬럼은 L_DTXGCD_DTL_BNFT_IF 라는 이름으로 PAK테이블 스페이스에 생성되었다


CLOB인덱스는 X_DTXGCD_DTL_BNFT_IF란 이름으로 PAK테이블 스페이스에 생성되었다.


LOBINDEX LOBSEGMENT의 테이블스페이스와 동일한 테이블 스페이스에 생성된다.



결과를 확인하기 위해서 조회를 하면 <그림-1>과 같다.

 

<그림-1>


select segment_name,segment_type,tablespace_name  from dba_segments  …




SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME                 

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

DTXGCD                         TABLE               PAK

X_DTXGCD_DTL_BNFT_IF           LOBINDEX           PAK

L_DTXGCD_DTL_BNFT_IF           LOBSEGMENT        PAK

 


테이블 이동

일반적인 방법 alter table.. move로 테이블을 옮겨보자.

<그림 -2>


alter  table DTXGCD move tablespace users;

 



SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME                

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

X_DTXGCD_DTL_BNFT_IF           LOBINDEX           PAK

L_DTXGCD_DTL_BNFT_IF           LOBSEGMENT         PAK

DTXGCD                         TABLE              USERS

 

<그림-2>와 같이 테이블을 이동하였을 경우 테이블은 users라는 테이블 스페이스로 이동되었지만 lob인덱스와 lob컬럼(세그먼트)  여전히 PAK테이블 스페이스에 존재한다.

 

 

 

 

 

Lob index, lob segment 이동

 

lob indexlob segment를 이동시키는 방법은 아래와 같다.(lobindexlobsegment를 각각 다른테이블 


스페스페이 생성하는 것은 불가. lobsegment테이블스페이스위치에 lobindex생성됨)



 

ALTER TABLE DTXGCD MOVE LOB(DTXGCD_DTL_BNFT_IF) STORE AS L_DTXGCD_DTL_BNFT_IF


(TABLESPACE users STORAGE (initial 2M));


 


SEGMENT_NAME             SEGMENT_TYPE   TABLESPACE_NAME                

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

L_DTXGCD_DTL_BNFT_IF        LOBSEGMENT        USERS

X_DTXGCD_DTL_BNFT_IF        LOBINDEX           USERS

DTXGCD                      TABLE               USERS

 

 

 

 

 

 

테이블과 lobsegment,lobindex  이동


 

테이블과 lobsegment를 한번에 이동하는 명령은 아래와 같다.



alter table DTXGCD move  lob(DTXGCD_DTL_BNFT_IF) store as 


(tablespace users  storage ( initial 3m next 2m)  )


  storage ( initial 3m next 2m)


  tablespace users ;

 



 

lob segment를 포함하는 파티셔닝테이블의 이동


이번에는 lob segment를 포함하는 파티셔닝테이블의 이동에 대해서 알아보자.


   생성

create table show_lob_storage

   (aaa number(5),  

    bbb varchar2(10), 

     ccc number(5),  

      ddd CLOB ) 

      PARTITION BY RANGE(aaa) 

      (PARTITION p1 VALUES LESS THAN (50) tablespace part01 

           LOB (ddd) STORE AS L_DDD_50 (tablespace part01)   , 

          PARTITION p2 VALUES LESS THAN (100) tablespace part02 

            LOB (ddd) STORE AS L_DDD_100 (tablespace part02)  , 

          PARTITION p3 VALUES LESS THAN (MAXVALUE) tablespace part03 

            LOB (ddd) STORE AS L_DDD_MAX (tablespace part03) )  ;


< LOB_PARTITION_NAME> - 세그먼트네임이아니라 랍파티션네임이다


 


생성스크립트에서 LOB(ddd) STORE AS 뒤에 오는 이름은 lobsegment이름이 아니라 lob_partition_name이라는 

사실에 주의한다. 파티셔닝테이블에 lobsegment이름을 지정할수 없다. <그림-3>의 lob_name참조.


<
그림-3>


select partition_name,lob_name,, lob_partition_name, tablespace_name      from user_lob_partitions 

where table_name = 'SHOW_LOB_STORAGE';

 

PARTITION_NAME    LOB_NAME              LOB_PARTITION_NAME    TABLESPACE_NAME

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

P2         SYS_LOB0000105301C00004$$           L_DDD_50                     PART01

P1         SYS_LOB0000105301C00004$$          L_DDD_100                     PART02

P3         SYS_LOB0000105301C00004$$            L_DDD_MAX                   PART03


 

 

파티션과 랍세그먼트를 한번에 part02에서 part04로이동해보자


이때 주의 할점은 파티션을 이동할 때 , LOB_PARTITION_NAME은 기존이름과는  달리해줘야한다.


<그림-3>에서는 P1파티션의 LOB_PARTITION_NAME은 L_DDD_100였지만 <그림-4>에서 P1파티션의


LOB_PARTITION_NAME은 _DDD_PART4이다. (같은이름으로 지정시 에러발생)


 

<그림-4>


alter table SHOW_LOB_STORAGE move partition P1 tablespace PART04  

    lob(DDD) store as L_DDD_part4 (tablespace PART04); 

 


PARTITION_NAME             LOB_PARTITION_NAME    TABLESPACE_NAME

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

P2                             L_DDD_50                       PART01

P1                             L_DDD_PART4                    PART04

P3                             L_DDD_MAX                     PART03



 

 

랍세그먼트의 파티션을 이동하여도 인덱스는 unusable로 빠지지 않는다.


select partition_name, tablespace_name, status from user_ind_partitions;





출처: http://andwiz.tistory.com/entry/LOB-segment-관리 [(주)앤드위즈]