DB (데이터베이스)/Oracle (오라클)

[Oracle] oracle table,index,lob의 tablespace move방법

뜽배 2024. 1. 15. 20:33
728x90
반응형

이번 포스트에서는 table, index, lob index의 tablespace move방법에 대해서 알아보겠습니다.

 

우선 TEST라는 테이블스페이스에 table, index, lob index를 생성해 보겠습니다.

 

 

1. 테스트 오브젝트 생성

1-1. 테이블 'A' 생성

CREATE TABLE A (name varchar(100), value varchar(100)) TABLESPACE TEST;

insert into A values ('name1', 'value1');
commit;

 

※ 데이터를 insert하지 않으면 dba_segment 뷰에서 segment를 볼 수 없음.

 

1-2. index 'PK_A' 생성

CREATE INDEX PK_A ON a (name) TABLESPACE TEST;

 

 

1-3. 테이블 'B' 생성 (lob index, lob segment) 

CREATE TABLE b (name varchar(100), value clob) TABLESPACE TEST;

※ lob형태의 컬럼을 생성할 경우 자동으로 lob index, lob segment가 생성됩니다.

 

이렇게 테스트를 할 object들을 생성한 후 'TEST' tablespace에 어떤 segment가 들어있는지 조회합니다.

 

SELECT 
	owner,
	segment_name,
	segment_type, 
	tablespace_name
FROM dba_segments
WHERE tablespace_name = 'TEST';

 

위와 같이 조회하면 아래와 같은 결과를 확인 할 수 있습니다.

 

 

 

2. TEST2 tablespace 생성

CREATE TABLESPACE TEST2 DATAFILE 'C:\APP\ORADATA\ORCL\TEST2_01.DBF' SIZE 10M autoextend OFF;

TEST -> TEST2 로 tablespace를 옮길 껀데 object들을 받을 TEST2 tablespace를 생성해 줍니다.

 

 

3. table과 index의 logging, degree값을 확인한다.

실제 현업 운영중에서는 기존 table과 index의 설정을 그대로 해야하는 경우가 많습니다. 따라서 tablespace를 move하기전에 table, index의 옵션값을 백업해주는 것을 추천드립니다.

 

 

3-1. table의 logging, degree값

SELECT 
	owner,
	table_name,
	tablespace_name,
	status,
	logging,
	degree
FROM DBA_tables
WHERE tablespace_name = 'TEST';

 

3-2. index의 logging, degree값

SELECT 
	owner,
	index_name,
	tablespace_name,
	status,
	logging,
	degree
FROM DBA_indexes
WHERE tablespace_name = 'TEST';

 

 

4. 각 object의 tablespace를 move한다.

우선 각 object의 tablespace를 move하기 전에 table과 index의 logging상태가 'YES'였습니다. 
만약 데이터가 많은 경우 move할때 매우 많은 redo log를 기록하게 되며, 많은 redo log기록은 많은 archive log파일을 기록하게 됩니다.
logging이 'YES'일 경우에 작업시간이 매우 오래 걸릴 수 있으므로 작업 하기 전 logging옵션을 'NO'로 만든 후 작업이 끝나고 'YES'로 바꿀것입니다.

/* table nologging*/
ALTER TABLE a nologging;
ALTER TABLE b nologging;

/* index nologging*/
ALTER INDEX pk_a nologging;

※ lob index의 경우 lob segment를 move하면 자동으로 생성되기 때문에 작업하지 않는다.

 

 

위 사진처럼 logging이 'NO'로 바뀐것을 확인 할 수 있다.

 

 

4-2. table, index의 tablespace move

/* table move*/
ALTER TABLE A MOVE TABLESPACE TEST2 nologging parallel 8;
ALTER TABLE B MOVE TABLESPACE TEST2 nologging parallel 8;

/* index move*/
ALTER INDEX PK_A REBUILD TABLESPACE TEST2 nologging parallel 8;

※ parallel 8 옵션의 경우 빠르게 넘기기 위해 옵션을 주었다. 작업이 완료된 후 degree값이 8로 변경될 수 있으니 유의해야한다.

 

 

4-3. LOB INDEX, LOB SEGMENT tablespace move

lob segment의 tablespace move 포맷은

ALTER TABLE <테이블명> MOVE LOB(<LOB컬럼명>, <LOB컬럼명>) STORE AS (TABLESPACE <옮길 tablespace명>);

으로 tablespace move를 할 수 있다.

 

/* lob segment move */
ALTER TABLE B MOVE LOB(VALUE) STORE AS (TABLESPACE TEST2);

※ LOB SEGMENT만 옮기면 LOB INDEX는 옮겨진 tablespace에서 자동으로 생성된다.

 

4-4. TEST1, TEST2 tablespace의 SEGMENT조회

테이블 조회

SELECT 
	owner,
	table_name,
	tablespace_name,
	status,
	logging,
	degree
FROM DBA_tables
WHERE tablespace_name in ('TEST', 'TEST2');

 

TABLE의 경우 위 사진처럼 tablespace는 TEST2로 변경되었지만 LOGGING은 'NO'이다.

 

인덱스 조회

SELECT 
	owner,
	index_name,
	tablespace_name,
	status,
	logging,
	degree
FROM DBA_indexes
WHERE tablespace_name in ('TEST', 'TEST2');

INDEX의 경우 위 사진처럼 PK_A의 tablespace는 TEST2로 변경되었지만 LOGGING은 'NO'이며, ALTER INDEX REBUILD할 때 parallel옵션을 8로 주었기 때문에 degree값이 8이 된 것을 확인할 수 있다 이 원래대로 바꿔준다.

 

4-5 table, index의 logging값과 degree값을 원래대로 변경한다.

/* table logging */
ALTER TABLE A LOGGING;
ALTER TABLE B LOGGING;

/* index logging, parallel 1*/
ALTER INDEX PK_A LOGGING;
ALTER INDEX PK_A PARALLEL (DEGREE 1);

 

table의 logging옵션이 'YES'로 돌아왔다. 그리고 index의 logging과 degree또한 원래값대로 돌아왔다.

 

실제 현업 운영에서는 이 작업을 마무리 하고 table, index, table건수 등 모든 검증을 완료해고 작업을 마무리 한다.

728x90
반응형