본문 바로가기
ORACLE/ADMIN

[Oracle] Transportable Tablespace 가장 빠른 데이터 이동 방법

by 마이자몽 🌻♚ 2020. 7. 18.

Transportable Tablespace

Transportable Tablespace는 오라클에서 오라클 데이터베이스로 데이터를 이동할때 가장 빠른방법이라고 합니다. 데이터펌프나 Export, Import 유틸리티를 사용할때는 그냥 insert작업을 하는 것과 비슷하다고 한다면 Transport Tablespace는 Datapump를 사용하여 메타데이터 즉 구조만 추출하고 데이터파일 자체를 이동시켜 migration 작업을 합니다. 

 

Transport Tablespace를 이용하여 데이터를 이동할때는 운영체제에 대한 제한이 있습니다. 데이터파일 자체를 이동시키다보니 파일을 저장하는 방식이 OS에 따라 상이하여 Platform의 Endian 정보만 같다면 이동이 가능했습니다. 하지만 이제는 Endian의 정보가 다르더라도 RMAN을 통해서 Converting하여 데이터파일의 형식을 변경할 수 있어 모든 OS에서 호환이 가능합니다.

 

SYS@newdb> select platform_name, endian_format from v$transportable_platform;

Endian에 대한 정보는 v$transportable_platform 뷰를 통해서 확인할 수 있습니다.

 

 

SYS@newdb> select platform_name from v$database;

현재 Database의 Platform을 확인하고 Endian 정보를 확인할 수 있습니다.

 

 

Trasportable Tablespace 실습

실습환경

OS : Red Hat Enterprise Linux Server release 6.10
DB : Oracle 11.2.0.1
SID : orcl, newdb (1개 서버 2개 데이터베이스)
host : 601d2fce71dc

 

 

실습목표

- Transportable Tablespace를 이용해서 orcl에서 생성한 tts tablespace 데이터를 newdb로 이동
- orcl의 hr 스키마와 newdb에서 allen 스키마를 생성해서 이동

 

 

 

Export 사전 작업

[oracle@601d2fce71dc ~]$ mkdir /opt/oracle/tbs

편의를 위해 생성할 테이블스페이스의 경로를 미리 만들어둡니다.

 

[oracle@601d2fce71dc ~]$ sqlplus / as sysdba
SYS@orcl> create tablespace tts01 datafile '/opt/oracle/tbs/tts01.dbf' size 50m;

Tablespace created.

SYS@orcl> create tablespace tts02 datafile '/opt/oracle/tbs/tts02.dbf' size 50m;

Tablespace created.

두개의 테이블스페이스를 사용해서 실습을 진행하겠습니다.

 

 

SYS@orcl> create table hr.emp_test tablespace tts01 as select * from hr.employees;

Table created.

SYS@orcl> create table hr.dept_test tablespace tts02 as select * from hr.departments;

Table created.

생성한 테이블스페이스에 각각 데이터가 들어있는 테이블을 하나씩 생성해줬습니다.

 

 

SYS@orcl> alter table hr.dept_test add constraint dept_test_pk primary key(department_id);

Table altered.

SYS@orcl> alter table hr.emp_test add constraint emp_test_dept_fk foreign key(department_id) references hr.dept_test(department_id);

Table altered.

생성한 테이블에 primary key와 foreign key를 생성해줍니다.

 

 

 

 dbms_tts.transport_set_check 프로시저 확인

SYS@orcl> desc dbms_tts

dbms_tts 패키지의 transport_set_check 프로시저를 이용해서 tts01과 tts02 테이블스페이스가 Transportable tablespace를 이용해서 export가 가능한지 확인하는 작업을 진행할겁니다.

 

 

 

SYS@orcl> 
begin
dbms_tts.transport_set_check
(ts_list=>'tts01,tts02',
incl_constraints=>true);
end;
/

PL/SQL procedure successfully completed.
SYS@orcl> select * from transport_set_violations;

dbms_tts.transport_set_check 프로시저를 이용해서 이동하려는 테이블스페이스를 transportable하게 가능한지 확인작업을 했습니다. 결과는 transport_set_violations 뷰를 이용해서 확인할 수있습니다.

 

해당 실습에서 확인 결과 index에 대한 violation이 발생합니다. hr.dept_test 테이블에서 primary key를 만들면서 인덱스가 생성되었습니다. 하지만 해당 인덱스는 default tablespace인 examples 테이블에 생성되어 만약 이상태로 테이블스페이스를 이동하게되면 인덱스의 누락으로 문제가 발생합니다. 이동 가능하도록 index의  rebuild 작업을 진행해야합니다.

 

SYS@orcl> alter index hr.dept_test_pk rebuild tablespace tts02;

Index altered.

인덱스의 rebuild를 진행했습니다. 다시 프로시저로 데이터 이동이 가능한지 확인하겠습니다.

 

 

SYS@orcl> 
begin
dbms_tts.transport_set_check
(ts_list=>'tts01,tts02',
incl_constraints=>true);
end;
/

PL/SQL procedure successfully completed.
SYS@orcl> select * from transport_set_violations;

no rows selected

transport_set_violations 뷰를 확인했을때 보여지는 데이터가 없다면 문제가 없다는 뜻입니다. Transportable tablespace를 사용하면 꼭 사전에 dbms_tts 패키지를 이용해서 문제가 있는지 확인작업 및 해결 후 진행해줘야합니다.

 

 

Datapump Transportable Tablespace Export

SYS@orcl> alter tablespace tts01 read only;

Tablespace altered.

SYS@orcl> alter tablespace tts02 read only;

Tablespace altered.
SYS@orcl> select tablespace_name, status from dba_tablespaces;

Transportable Tablespace를 export 작업을 할때 꼭 Read only 상태로 변경 후 작업을 진행합니다. Transportable Tablespace는 데이터파일 자체를 이동시켜서 작업하기 때문에 export 하는 과정에서 dml 작업으로 테이블의 구조가 변경되었을때 import시 데이터파일에서의 정보가 export한 구조와 상이하여 문제가 발생합니다.

 

 

[oracle@601d2fce71dc ~]$ mkdir /opt/oracle/dbpump
SYS@orcl> create directory pump_dir as '/opt/oracle/dbpump';

Directory created.

Datapump에서 지정할 Directory 오브젝트를 만들어줍니다. export되는 테이블의 구조를 해당 디렉토리로 내릴것입니다.

 

 

[oracle@601d2fce71dc ~]$ expdp system/oracle dumpfile=tts.dmp directory=pump_dir transport_tablespaces=tts01,tts02

datapump를 사용하는 방법과 같이 사용하는데 transport_tablespace 옵션을 같이 사용하여 export 작업을 진행합니다.

 

 

[oracle@601d2fce71dc ~]$ mkdir /opt/oracle/newdb_tbs
[oracle@601d2fce71dc ~]$ cp /opt/oracle/tbs/tts0* /opt/oracle/newdb_tbs/

newdb sid에서 바라볼 데이터파일의 경로 위치를 만들어줍니다. 이후 orcl에서 만들어 놓은 tablespace의 데이터파일들을 모두 이동시켜줍니다.

 

 

Datapump Transportable Tablespace import

[oracle@601d2fce71dc ~]$ . oraenv
ORACLE_SID = [orcl] ? newdb
The Oracle base for ORACLE_HOME=/opt/oracle/app/product/11.2.0/dbhome_1 is /opt/oracle/app

newdb 데이터베이스에 맞춰 환경변수를 변경하는 작업을 진행합니다.

 

 

SYS@newdb> create directory pump_dir as '/opt/oracle/dbpump';

Directory created.

import 작업을 위해 orcl에서 export한 파일의 디렉토리와 동일한 디렉토리 오브젝트를 생성해줍니다.

 

 

SYS@newdb> create user allen identified by allen account unlock;

User created.

SYS@newdb> grant connect, resource to allen;

Grant succeeded.

데이터를 import할 스키마를 생성합니다.

 

 

[oracle@601d2fce71dc ~]$ impdp system/oracle dumpfile=tts.dmp directory=pump_dir remap_schema=hr:allen transport_datafiles=/opt/oracle/newdb_tbs/tts01.dbf,/opt/oracle/newdb_tbs/tts02.dbf

이상없이 데이터를 import 했습니다.

 

 

확인

SYS@newdb> select tablespace_name, file_name from dba_data_files;

이동하려는 테이블스페이스 모두 import 되었습니다.

 

 

SYS@newdb> conn allen/allen
Connected.
ALLEN@newdb> select table_name from tabs;

생성한 테이블들도 모두 import된것을 확인할 수 있습니다.

 

댓글0