tablespace 생성 스크립트

2010. 4. 30. 15:31Oracle/Oracle Tip

반응형
테이블 스페이스 생성 스크립트 입니다.
디비이관 작업할 때 유용하게 쓰일 것 같네요.

select  tablespace_name, dbms_metadata.get_ddl('TABLESPACE',tablespace_name)||';' script
from    dba_tablespaces
where  tablespace_name not in ('TEMP','USERS','UNDOTBS1','SYSTEM','SYSAUX');

아래와 같이 스크립트가 생성된다.

 CREATE TABLESPACE "aaa" DATAFILE 
 '/oracle/oradata/Disk4/aaa.dbf' SIZE 104857600
 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M
 NOLOGGING ONLINE PERMANENT BLOCKSIZE 8192
 EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
 ;

주의 할 점.

위 스크립트를 그대로 실행시켰을경우. tablespcae 이름이 쌍따옴표를 포함한 "AAA" 으로 등록이 되어지는데 
dba_tablespaces를 보면 AAA로 보여진다. 
추후 drop 을 할려고 무심코 아래와 같은 쿼리문을 날렸는데 에러를 발생시키면 원인 찾기가 참 힘들어 지겠군요.

drop tablespace aaa including contents and datafiles;

ORA-00959: 테이블스페이스 'AAA'이(가) 존재하지 않습니다.

select tablespace_name from dba_tablespaces where tablespace_name = 'aaa';

TABLESPACE_NAME
aaa

변경및 수정할때에도 아래와 같이 지워야 하네요.
drop tablespace "aaa" including contents and datafiles;

--나의 의견.
쌍따옴표를 제거한 후 실행시키는 것이 관리하기에 편하다고 생각합니다.
유용한 스크립트이지만 하나하나 뜯어보고 불필요한 부분에 대해서는 편집이 필요하다고 생각되어집니다.

저는 위 쿼리보다는 아래 쿼리를 사용하고 있습니다.
위 쿼리는 속도도 많이 느리고,  쌍따옴표의 포함 등등 저에게는 좀 안맞는 쿼리인듯 싶네요.

아래 쿼리가 무식하고 더 불편하긴 하지만 저는 나름 편집해서 사용하고 있습니다.(특성에 따라 쿼리를 수정해줘야해서..)

select  
'CREATE TABLESPACE '||tablespace_name||
'DATAFILE 
'''||data1||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M,
'''||data2||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M,
'''||data3||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M,
'''||data4||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M 
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16777216 SEGMENT SPACE MANAGEMENT AUTO;' script
from
(
    select   tablespace_name,
             max(case when rank=1 then file_name end) data1,
             max(case when rank=2 then file_name end) data2,
             max(case when rank=3 then file_name end) data3,
             max(case when rank=4 then file_name end) data4
    from
    (
        select  file_name, tablespace_name, row_number() over(partition by tablespace_name order by file_name) rank
        from    dba_data_files b
        where  tablespace_name not in ('SYSTEM','UNDOTBS1','SYSAUX','TEMP','USERS')
    )
    group by tablespace_name
)
;
반응형

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

long형 replace  (0) 2011.01.24
LONG과 CLOB 에 대한 데이터 이전.  (0) 2011.01.04
테이블 read only 설정  (0) 2010.01.27
1년치 날짜 생성.  (0) 2010.01.14
유용 update문  (0) 2009.12.09