본문 바로가기

DB/Oracle

오라클 사용자 tablespace 변경

단순하게 물리적인 Tablespace이동이라면 파일 이동하시면 됩니다.

Step1)  Tablespace OffLine

-> ALTER TABLESPACE tablespace명 OFFLINE;

Step2) file copy

-> cp oldfile newfile

Step3) Target Tablespace 수정

-> ALTER DATABASE tablespace명 rename file 'oldFile' to 'newFile';

Step4) Tablespace OnLine

-> ALTER TABLESPACE tablespace명 ONLINE;

단, 시스템 TableSpace이라면 shutdown 하셔야합니다.

 

그런데 그게아니라 특정 테이블의 TableSpace이동이라면

수동으로 Target Table과 Constraint 등을 변경하고 인덱스 또한 Rebuild하여야 합니다.

예는 제가 간단히 스크립트 만들어 보았습니다.

활용하시면 될듯

/* 1.테이블별 Constraints(PrimaryKey, Unique) 삭제 Script */
SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||index_name||';' stmt
FROM  USER_INDEXES
WHERE table_name = '테이블명'
AND   index_name like '%PK'
;

/* 2.테이블 이동 Script */
SELECT 'ALTER TABLE '||table_name||' MOVE TABLESPACE 테이블스테이스명;' stmt
FROM  USER_INDEXES
WHERE table_name = '테이블명'
;

/* 3.INDEX이동(Rebuild) Script */
SELECT 'ALTER INDEX '||index_name||' REBUILD TABLESPACE 테이블스테이스명;' stmt
FROM  USER_INDEXES
WHERE table_name = '테이블명'
;

/* 4.Index - Primary Key설정 Script */
SELECT 'ALTER TABLE '||a.table_name||
       ' ADD CONSTRAINT "'||a.index_name||'" PRIMARY KEY ("'||col_list||'")'||
       ' USING INDEX PCTFREE 10 INITRANS 1 MAXTRANS 255 COMPUTE STATISTICS'||
       ' STORAGE(INITIAL 65536 NEXT 65536 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)'||
       ' TABLESPACE 테이블스테이스명 ENABLE;' stmt
FROM  (
        SELECT a.table_name
              ,index_name
              ,max(idx_col1 )||decode(max(idx_col2 ),'','',',')||
               max(idx_col2 )||decode(max(idx_col3 ),'','',',')||
               max(idx_col3 )||decode(max(idx_col4 ),'','',',')||
               max(idx_col4 )||decode(max(idx_col5 ),'','',',')||
               max(idx_col5 )||decode(max(idx_col6 ),'','',',')||
               max(idx_col6 )||decode(max(idx_col7 ),'','',',')||
               max(idx_col7 )||decode(max(idx_col8 ),'','',',')||
               max(idx_col8 )||decode(max(idx_col9 ),'','',',')||
               max(idx_col9 )||decode(max(idx_col10),'','',',')||
               max(idx_col10)||decode(max(idx_col11),'','',',')||
               max(idx_col11)||decode(max(idx_col12),'','',',')||
               max(idx_col12)||decode(max(idx_col13),'','',',')||
               max(idx_col13)||decode(max(idx_col14),'','',',')||
               max(idx_col14)||decode(max(idx_col15),'','',',')||
               max(idx_col15) col_list
        FROM  (
                SELECT a.table_name
                      ,b.column_name
                      ,a.index_name
                      ,b.column_position
                      ,decode(b.column_position,1 ,b.column_name) idx_col1
                      ,decode(b.column_position,2 ,b.column_name) idx_col2
                      ,decode(b.column_position,3 ,b.column_name) idx_col3
                      ,decode(b.column_position,4 ,b.column_name) idx_col4
                      ,decode(b.column_position,5 ,b.column_name) idx_col5
                      ,decode(b.column_position,6 ,b.column_name) idx_col6
                      ,decode(b.column_position,7 ,b.column_name) idx_col7
                      ,decode(b.column_position,8 ,b.column_name) idx_col8
                      ,decode(b.column_position,9 ,b.column_name) idx_col9
                      ,decode(b.column_position,10,b.column_name) idx_col10
                      ,decode(b.column_position,11,b.column_name) idx_col11
                      ,decode(b.column_position,12,b.column_name) idx_col12
                      ,decode(b.column_position,13,b.column_name) idx_col13
                      ,decode(b.column_position,14,b.column_name) idx_col14
                      ,decode(b.column_position,15,b.column_name) idx_col15
                FROM  USER_INDEXES     A
                     ,USER_IND_COLUMNS B
                WHERE b.index_name = a.index_name
                AND   a.table_name = '테이블명'
                AND   a.index_name like '%PK'
              ) a
        GROUP BY a.table_name,a.index_name
      ) a
;

/* 5.Index - Unique 생성 Script */
SELECT 'CREATE UNIQUE INDEX '||a.index_name||
       ' ON '||a.table_name||'('||col_list||')'||
       ' PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS'||
       ' STORAGE(INITIAL 65536 NEXT 65536 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)'||
       ' TABLESPACE 테이블스테이스명;'
FROM  (
        SELECT a.table_name
              ,index_name
              ,max(idx_col1 )||decode(max(idx_col2 ),'','',',')||
               max(idx_col2 )||decode(max(idx_col3 ),'','',',')||
               max(idx_col3 )||decode(max(idx_col4 ),'','',',')||
               max(idx_col4 )||decode(max(idx_col5 ),'','',',')||
               max(idx_col5 )||decode(max(idx_col6 ),'','',',')||
               max(idx_col6 )||decode(max(idx_col7 ),'','',',')||
               max(idx_col7 )||decode(max(idx_col8 ),'','',',')||
               max(idx_col8 )||decode(max(idx_col9 ),'','',',')||
               max(idx_col9 )||decode(max(idx_col10),'','',',')||
               max(idx_col10)||decode(max(idx_col11),'','',',')||
               max(idx_col11)||decode(max(idx_col12),'','',',')||
               max(idx_col12)||decode(max(idx_col13),'','',',')||
               max(idx_col13)||decode(max(idx_col14),'','',',')||
               max(idx_col14)||decode(max(idx_col15),'','',',')||
               max(idx_col15) col_list
        FROM  (
                SELECT a.table_name
                      ,b.column_name
                      ,a.index_name
                      ,b.column_position
                      ,decode(b.column_position,1 ,b.column_name) idx_col1
                      ,decode(b.column_position,2 ,b.column_name) idx_col2
                      ,decode(b.column_position,3 ,b.column_name) idx_col3
                      ,decode(b.column_position,4 ,b.column_name) idx_col4
                      ,decode(b.column_position,5 ,b.column_name) idx_col5
                      ,decode(b.column_position,6 ,b.column_name) idx_col6
                      ,decode(b.column_position,7 ,b.column_name) idx_col7
                      ,decode(b.column_position,8 ,b.column_name) idx_col8
                      ,decode(b.column_position,9 ,b.column_name) idx_col9
                      ,decode(b.column_position,10,b.column_name) idx_col10
                      ,decode(b.column_position,11,b.column_name) idx_col11
                      ,decode(b.column_position,12,b.column_name) idx_col12
                      ,decode(b.column_position,13,b.column_name) idx_col13
                      ,decode(b.column_position,14,b.column_name) idx_col14
                      ,decode(b.column_position,15,b.column_name) idx_col15
                FROM  USER_INDEXES     A
                     ,USER_IND_COLUMNS B
                WHERE b.index_name = a.index_name
                AND   a.table_name = '테이블명'
                AND   a.index_name like '%PK'
              ) a
        GROUP BY a.table_name,a.index_name
      ) a
;

테이블 목록 : select TABLE_NAME FROM USER_TAB_COMMENTS

출처 : 
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10205&docId=109867350&qb=VEFCTEVTUEFDReuzgOqyvQ==&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gOzfAg331ylssuS3eZVssv--494528&sid=TdzSiTLG3E0AACV3LU0


 

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

오라클 정규식 (REGEXP_LIKE)  (0) 2011.06.07
DB export/import (tablespace가 다를경우)  (0) 2011.05.31
다중row를 컬럼으로 변경 (ORACLE)  (0) 2011.04.29
유용한 sql  (0) 2011.04.28
ORACLE segment관리  (0) 2011.01.10