티스토리 뷰

- 서론
똑같은 테이블을 파티셔닝 해야하는 일이 생겼다.
7개월 정도만에 관리이슈가 생겨버린것이다.. (늘.. 사이징은 철저하지 못하다)
관리이슈가 생긴 테이블들의 인덱스 생성 스크립트를 백업하고,
이에 대해 테이블 스페이스를 옮겨서 데이터만 보존하고,
다시 파티셔닝 테이블로 CTAS하는 과정을 거쳐 최종 파티셔닝 테이블을 만들고,
백업한 인덱스 스크립트에 local 옵션을 추가하거나 global로 인덱스를 생성하여
최종 마무리를 하였다.

아쉬움이 남는건, move tablespace가 가물가물하여 CTAS를 두번했다는 것이다 ㅡ,.ㅡ
아래는 이러한 파티셔닝 작업 과정에서 잊지않고 사용하여야 할
몇가지 팁에 대해 소개하려고 한다.

- 본론
1. transport tablespace
SQL> alter table 테이블명 move tablespace 타겟테이블스페이스명;
table altered.

2. transport indexes
SQL> alter index 인덱스명 rebuild tablespace 타겟테이블스페이스명;
index altered.

3. Technote에서 소개한 move 스크립트 생성 SQL
      set echo off
      column order_col1 noprint
      column order_col2 noprint
      set heading off
      set verify off
      set feedback off
      set echo off

      spool tmp.sql

      select decode( segment_type, 'TABLE', segment_name, table_name ) order_col1,
                    decode( segment_type, 'TABLE', 1, 2 ) order_col2,
                    'alter ' || segment_type || ' ' || segment_name ||
                    decode( segment_type, 'TABLE', ' move ', ' rebuild ' ) || chr(10) ||
                    ' tablespace &1 ' || chr(10) ||
                    ' storage ( initial ' || initial_extent || ' next ' ||
                    next_extent || chr(10) ||
                    ' minextents ' || min_extents || ' maxextents ' ||
                    max_extents || chr(10) ||
                    ' pctincrease ' || pct_increase || ' freelists ' ||
                    freelists || ');'
      from user_segments, (select table_name, index_name from user_indexes )
      where segment_type in ( 'TABLE', 'INDEX' )
      and segment_name = index_name (+)
      order by 1, 2

      spool off
 

위 script를 실행함으로써, "alter table move" and "alter index rebuild" 구문을 생성할 수 있고, 더불어 storage parameter 값 또한 얻을수 있다.

생성 구문을 보면 table 먼저 alter .. move 하고, 이후 alter index ... rebuild 작업을 수행함을 확인할 수 있다. alter table ... move 수행 결과로 index 상태가 unusable 로 변환되기 때문에 index rebuild 작업이 필요한 것이고, table의 downtime을 최소화 하기 위해 필요한 조치이다.

기존의 export/import 방법과의 비교.
 1. "alter table .. move" 방법(A)이 기존 exp/imp 방법(B)보다 빠르고 유연성을 제공한다.
 2. A 방법은 기존 objects를 drop 할 필요가 없으나, B 방법은 필요하다.
 3. A 방법을 사용할 때 LONG / LONG RAW datatype을 갖고 있는 table은 위 구문을 적용할 수 없다
 (only B method)
 4. B 방법을 사용할 때 작업 도중 변화되는 block 정보를 Oracle이 보장하지 못한다.

4. transportable tablespace
서로다른 운영체제 서로다른 서버로 테이블을 옮기기위해서는 먼저
target과 source 서버의 운영체제가 각각 어떤 byte order를 따르는지를 확인하고
서로다른 바이트 order를 따른다면 바꾸어주어야 데이터를 깨지지 않게 옮길수가 있다.

확인 방법은 아래와 같다.
SQL> select * from v$transportable_platform order by platform_id;

PLATFORM_ID PLATFORM_NAME                       ENDIAN_FORMAT
----------- ----------------------------------- --------------
          1 Solaris[tm] OE (32-bit)             Big
          2 Solaris[tm] OE (64-bit)             Big
          3 HP-UX (64-bit)                      Big
          4 HP-UX IA (64-bit)                   Big
          5 HP Tru64 UNIX                       Little
          6 AIX-Based Systems (64-bit)          Big
          7 Microsoft Windows IA (32-bit)       Little
          8 Microsoft Windows IA (64-bit)       Little
          9 IBM zSeries Based Linux             Big
         10 Linux IA (32-bit)                   Little
         11 Linux IA (64-bit)                   Little
         12 Microsoft Windows 64-bit for AMD    Little
         13 Linux 64-bit for AMD                Little
         15 HP Open VMS                         Little
         16 Apple Mac OS                        Big
두개가 같은 byte order를 따른다면, 다음과 같은 과정을 거쳐
테이블을 다른 서버로 옮긴다.

- 테이블을 READ-ONLY 상태로 설정.

alter tablespace [테이블스페이스명] read only;

- 테이블을 익스포트 백업한다.. 운영체제 프롬프트에서 다음과 같이 입력한다:

exp tablespaces=[테이블스페이스명] transport_tablespace=Y file=[덤프파일명].dmp

- 덤프 파일과 소스 테이블스페이스에 할당된 .dbf 파일전체를 옮기고자 하는 서버로 복사한다.
- 덤프파일은 메타 데이타만을 포함하고 있으므로 파일 크기가 작다.
- 데이타베이스에 테이블스페이스를 “플러깅(plugging)” 한다. 운영체제 프롬프트에서 다음과 같이 입력한다.

shell> imp tablespaces=[타겟테이블스페이스명] transport_tablespace=y
file=[덤프파일명].dmp datafiles=[해당테이블스페이스에 할당된 datafile들];

앞서 테이블을 가져오는 부분에서.
exp 옵션에 TRIGGERS=y
CONSTRAINTS=y
GRANTS=y
rows=y
log=exp_transp_ts.lis
등을 설정함으로서 추가적인 제약사항들에 대해서 추가로 옮길수 있도록 설정할 수 있다.
댓글
댓글쓰기 폼