행위

일반 테이블 파티션 테이블 변경

DB CAFE

Dbcafe (토론 | 기여)님의 2020년 12월 1일 (화) 12:06 판 (새 문서: == 일반 테이블을 파티션 테이블로 변경 == === 일반 테이블 생성(테스트) === # 테이블 create table cristmas ( no varchar2(5), sdate varchar2(8), name varcha...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
thumb_up 추천메뉴 바로가기


1 일반 테이블을 파티션 테이블로 변경[편집]

1.1 일반 테이블 생성(테스트)[편집]

  1. 테이블

create table cristmas ( no varchar2(5), sdate varchar2(8), name varchar2(15) ) TABLESPACE TS_UNIX_DATA_001;

Table created.

  1. 인덱스

CREATE INDEX cristmas_idx01 ON cristmas (no,sdate) TABLESPACE TS_UNIX_DATA_001;

Index created.

1.2 임시로 파티션 테이블 생성(테이블이 운영중임을 경우, 변경시간을 단축)[편집]

  1. Range 파티션 임시_테이블 생성

SQL> create table cristmas_2008 ( no varchar2(5), sdate varchar2(8), name varchar2(15) ) TABLESPACE TS_UNIX_DATA_001 PARTITION BY RANGE (sdate) (

PARTITION cristmas_200808_PA VALUES LESS THAN ('20080832') TABLESPACE TS_UNIX_DATA_001,
PARTITION cristmas_200809_PA VALUES LESS THAN ('20080932') TABLESPACE TS_UNIX_DATA_001,
PARTITION cristmas_200810_PA VALUES LESS THAN ('20081032') TABLESPACE TS_UNIX_DATA_001

); Table created.

  1. LOCAL 인덱스 생성

SQL> CREATE INDEX cristmas_idx01_2008 ON cristmas_2008 (no,sdate) LOCAL (

PARTITION cristmas_200808_PA TABLESPACE TS_UNIX_DATA_001,
PARTITION cristmas_200809_PA TABLESPACE TS_UNIX_DATA_001,
PARTITION cristmas_200810_PA TABLESPACE TS_UNIX_DATA_001

); Index created.

  1. 파티션 생성 확인

SQL> SELECT * FROM ALL_PART_INDEXES SEGMENT NAME : cristmas_2008

OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME bytes(mb)


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

HAPPY CRISTMAS_2008 CRISTMAS_200808_PA TABLE PARTITION TS_UNIX_DATA_001 1 HAPPY CRISTMAS_2008 CRISTMAS_200809_PA TABLE PARTITION TS_UNIX_DATA_001 1 HAPPY CRISTMAS_2008 CRISTMAS_200810_PA TABLE PARTITION TS_UNIX_DATA_001 1


SQL> SELECT * FROM ALL_PART_TABLES SEGMENT NAME : cristmas_idx01_2008

OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME bytes(mb)


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

HAPPY CRISTMAS_IDX01_2008 CRISTMAS_200808_PA INDEX PARTITION TS_UNIX_DATA_001 1 HAPPY CRISTMAS_IDX01_2008 CRISTMAS_200808_PA INDEX PARTITION TS_UNIX_DATA_001 1 HAPPY CRISTMAS_IDX01_2008 CRISTMAS_200808_PA INDEX PARTITION TS_UNIX_DATA_001 1


  1. 파티션을 만드려는 일반 테이블의 데이터를 임시 테이블에 넣어주면 조건에 맞는 파티션 테이블로 데이터가 자동으로 삽입

SQL> INSERT INTO cristmas_2008 SELECT * FROM cristmas; 92 rows created.

  1. 파티션에 잘 나뉘어 들어갔는지 확인

SQL> select * from cristmas_2008 partition(cristmas_200809_PA);

31 rows selected.


  1. 이제 실 운영중인 일반 테이블과 임시로 만들었던 파티션 테이블을 rename으로 바꿔치기
  2. 테이블을 임시로 backup.

SQL> ALTER TABLE cristmas RENAME TO cristmas_bk; Table altered.

SQL> ALTER INDEX cristmas_idx01 RENAME TO cristmas_idx01_bk; Index altered.


  1. 임시로 만들었던 파티션 테이블을 실 운영 테이블 이름으로 rename

SQL> ALTER TABLE cristmas_2008 RENAME TO cristmas; Table altered. SQL> ALTER INDEX cristmas_idx01_2008 RENAME TO cristmas_idx01; Index altered.

  1. 파티션 확인
  2. 인덱스 확인
  3. 각 파티션별 데이터 확인

SQL> select * from cristmas partition(cristmas_200808_PA); SQL> select * from cristmas partition(cristmas_200809_PA); SQL> select * from cristmas partition(cristmas_200810_PA);

  1. 2008년 11월 데이터를 넣어보자.
 분할 조건 값에 정의되지 않는 값이 입력되면 에러 발생!!

SQL> INSERT INTO cristmas VALUES('93','20081101','go'); INSERT INTO cristmas VALUES('93','20081101','go')

           *

ERROR at line 1: ORA-14400: inserted partition key does not map to any partition

조건에 맞는 파티션을 ADD해준다.

(* 위에서 참조한 포스팅에서 언급했듯이 MAX 파티션이 있을 경우는 add는 안되고 split만 됨을 명심하자.)

SQL> ALTER TABLE cristmas ADD PARTITION cristmas_200811_pa VALUES LESS THAN (20081132);


Table altered.


  1. 200811 파티션이 생성되었다.
  2. 파티션 테이블 확인

SQL>

  1. 200811월 데이터를 넣어보자.

SQL> INSERT INTO cristmas VALUES('93','20081101','go'); SQL> commit;

  1. 200811 파티션에 잘 들어가 있음을 확인

SQL> select * from cristmas partition(cristmas_200811_PA);