Oracle/Admin

온라인 세그먼트 축소

알 수 없는 사용자 2016. 7. 28. 19:47

1. SHRINK 작업의 정의

  - SEGMENT에 할당된 EXTENT를 TABLESPACE로 반환하는 작업

  - SHRINK 작업으로 SEGMENT의 용량은 줄어들고, TABLESPACE의 용량은 줄어들지 않음(TABLESPACE의 용량은 축소시키기 위해서는 RESIZE 작업이 필요함)

  - 장점: INSERT,DELETE를 통해 데이터를 이동하기 때문에 추가적인 공간이 필요하지 않음

  - 단점: 일부 데이터만 이동하기 때문에 Row Migration이나 Chaining이 전체적으로 해결되지 않음

 

2. SHRINK 작업 방법

(출처: http://www.slideshare.net/ashilo/getting-to-know-oracle-database-objects-iot-mviews-clusters-and-more)


  - 빈 공간이 있는 데이터 블록의 데이터를 다른 빈 공간이 있는 데이터 블록에 적재(INSERT)

  - 기존 데이터 삭제(DELETE)

  - 고수위 이동



3. SHRINK 작업의 순서

 [작업 전 주의사항]

  - Oracle 10g 이상 가능

  - 관리 방식이 ASSM인 세그먼트에 대해서만 가능

  - SHRINK 작업 대상 테이블의 ROWID를 사용하는 오브젝트에 대해서 DISABLE 후 진행 또는 진행 후 재구성 필요

  - 데이터 블록 변경 작업이 INSERT, DELETE이기 때문에 Undo TABLESPACE를 사용. 따라서 변경 대상만큼의 Undo TABLESPACE 확장이 필요함


 [작업순서]

 - SHRINK 대상 테이블 선정

 - 대상 테이블의 인덱스 삭제

 - 대상 테이블 NOLOGGING 변경

 - 테이블에 걸린 TRGGIER DISABLE 변경

 - 테이블의 ROW MOVEMENT를 ENABLE로 변경

 - SHRINK 작업 진행

 - 테이블의 ROW MOVEMENT를 DISABLE로 변경

 - 대상 테이블 LOGGING 변경

 - 삭제한 인덱스 생성

 - 테이블에 걸린 TRIGGER ENABLE 변경


4. 테스트

4.1. 테이블스페이스 생성

CREATE TABLESPACE TEST_DATA 
DATAFILE 'C:\TABLESPACE\DATA\TEST_01.DBF' SIZE 1M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED ;

4.2. 테이블스페이스 용량 확인

SELECT    TABLESPACE_NAME, BYTES / 1024 / 1024 MB, FILE_NAME
FROM      DBA_DATA_FILES
WHERE     TABLESPACE_NAME = 'TEST_DATA';


 

4.3. 테이블 생성

CREATE TABLE SHRINK_TEST(VAL1   NUMBER
                  ,VAL2   VARCHAR2(100)
                  )
TABLESPACE TEST_DATA;

4.4. 데이터 적재

DECLARE 
BEGIN

 FOR I IN 1..1000000 LOOP
   INSERT INTO SHRINK_TEST(VAL1,VAL2) VALUES(I,'TEST'||I);
   IF MOD(I,10000) = 0 THEN
    COMMIT;
   END IF; 
 END LOOP;

END;
/

4.5. DATAFILE과 SEGMENT 용량 확인

SELECT    TABLESPACE_NAME, BYTES / 1024 / 1024 MB, FILE_NAME
FROM      DBA_DATA_FILES
WHERE     TABLESPACE_NAME = 'TEST_DATA';



SELECT    SEGMENT_NAME, BYTES/1024/1024 AS "SIZE(MB)"
FROM      DBA_SEGMENTS
WHERE     SEGMENT_NAME = 'SHRINK_TEST' ;

 

4.6. 데이터 삭제

DELETE SHRINK_TEST
WHERE  VAL1 BETWEEN 2000 AND 400000 ;

COMMIT;

4.7.테이블 NOLOGGING 변경

ALTER TABLE SHRINK_TEST NOLOGGING;

4.8. SHRINK 작업

ALTER TABLE SHRINK_TEST ENABLE ROW MOVEMENT;

ALTER TABLE SHRINK_TEST SHRINK SPACE  ;

4.9. DATAFILE과 SEGMENT 용량 확인


 


 


4.10. 테이블 LOGGING 변경

ALTER TABLE SHRINK_TEST LOGGING;


4.11. 테이블 ROW MOVEMENT 변경
ALTER TABLE SHRINK_TEST DISABLE ROW MOVEMENT;