프린트 하기

OS 환경 : Oracle Linux 8.7 (64bit)

 

DB 환경 : Oracle Database 19.27.0.0

 

방법 : 오라클 19c TTS(Transport Tablespace) 마이그레이션 방법

본문에서는 TTS(Transport Tablespace) 방식으로 데이터를 이관하는 방법을 설명함
Linux 환경의 19c db에서 동일 플랫폼, 동일한 버전의 다른 db로 일부 테이블스페이스만 이관하는 시나리오임
TTS가 동일 플랫폼 이관이고(Linux to Linux) XTTS는 다른 플랫폼간(다른 인디안간) 이관하는 방식임

참고 : 오라클 19c XTTS(Cross Platform Transport Tablespace) 마이그레이션 방법 ( https://positivemh.tistory.com/1326 )

 

 

TTS란?
Transport Tablespace는 오라클 데이터베이스에서 테이블스페이스 단위로 데이터를 이관하는 기능임
데이터를 논리적으로 Export/Import 하지 않고, 데이터파일 자체를 다른 데이터베이스로 전달하여 메타데이터만 Import하는 방식임

 

 

특징
- 테이블스페이스에 포함된 데이터파일을 그대로 복사하여 사용함
- 데이터 자체는 이동하지 않고 메타정보만 Import 하므로 속도가 매우 빠름
- 대용량 데이터 이관, DB 통합, 환경 이전 시 주로 사용됨
- 동일하거나 호환 가능한 플랫폼, 인디안 방식이 필요함

 

 

동작 방식 요약
1. 소스 db에서 이동할 테이블스페이스를 read only로 변경
2. 해당 테이블스페이스의 데이터파일을 타겟 서버로 복사
3. expdp/impdp를 이용해 tts 메타데이터만 import
4. 타겟 db에서 테이블스페이스를 read write로 전환

 

 

장점
- Export/Import 대비 매우 빠른 이관 속도 제공
- 대용량 테이블 이동 시 부하 최소화
- 네트워크 트래픽 감소
- XTTS(Cross Platform Transport Tablespace)시 os(플랫폼)이 달라도 이관 가능
- Rman 사용시 증분 데이터 이관 가능

 

 

제약 사항
- SYSTEM, SYSAUX 테이블스페이스는 이관 불가
- 플랫폼, 블록 사이즈가 동일해야함
- 소스와 타겟db의 캐릭터셋 호환이 맞아야함
- 이관 대상 테이블스페이스는 Self-Contained 조건을 만족해야 함(TRANSPORT_SET_CHECK로 사전 확인 가능)
(옮기려는 테이블스페이스에 데이터가 완전히 독립적으로 존재해야 한다는 뜻, 특정 오브젝트가 TTS 비대상 테이블스페이스에 걸쳐 있으면 안됨)

 

 

Self-Contained가 깨지는 대표적인 경우
- 테이블은 A TS에 있는데 인덱스는 B TS에 있음 => 불가
- 외래키(FK)가 다른 테이블스페이스의 테이블을 참조함 => 불가
- LOB 데이터는 LOB TS에 있고 테이블은 DATA TS에 있음 => DATA_TS만 옮기면 불가

 

 

Self-Contained가 되는 예
- 테이블, 인덱스, LOB 세그먼트가 전부 같은 테이블스페이스이거나
- 아예 같이 옮길 테이블스페이스 목록에 모두 포함되어 있음

 

 

소스 db 정보 : OS : Linux, SID : ORA19DBFS, 버전 : 19c, IP : 192.168.137.50
타켓 db 정보 : OS : Linux, SID : BIGDB, 버전 : 19c, IP : 192.168.137.60

 

 

테스트
샘플 테이블스페이스 생성

1
2
3
SQL> 
create tablespace migts datafile '/oraimsi/oradata/migts01.dbf' size 500m;
alter tablespace migts add datafile '/oraimsi/oradata/migts02.dbf' size 500m;

 

 

유저생성 및 권한 부여

1
2
3
4
5
6
7
SQL> create user miguser identified by miguser account unlock default tablespace migts quota unlimited on migts;
 
User created.
 
SQL> grant resource, connect, dba to miguser;
 
Grant succeeded.

 

 

테이블 생성

1
2
3
4
5
6
7
SQL> 
conn miguser/miguser
create table migtable(cola varchar2(20), colb number, colc number, 
cold varchar2(30), cole varchar2(30), colf varchar2(30), 
colg number, colh varchar2(30), coli varchar2(30), colj varchar2(30));
 
Table created.

 

 

샘플 데이터 삽입(DECLARE문 1번당 197mb) 총 5번 반복 => 약 880mb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SQL>
set serveroutput on;
DECLARE
TYPE tbl_ins IS TABLE OF MIGTABLE%ROWTYPE INDEX BY BINARY_INTEGER;
w_ins tbl_ins;
BEGIN
FOR i IN 1..1000000 LOOP 
   w_ins(i).COLA :=i;
   w_ins(i).COLB :=300000;
   w_ins(i).COLC :=999;
   w_ins(i).COLD :='DDDDDDDDDDDDDDDD';
   w_ins(i).COLE :='EEEEEEEEEEEEEEEE';
   w_ins(i).COLF :='FFFFFFFFFFFFFFFF';
   w_ins(i).COLG :=9999999;
   w_ins(i).COLH :='HHHHHHHHHHHHHHHHHHHHHHHHHH';
   w_ins(i).COLI :='IIIIIIIIIIIIIIIllllIIIIIIIIIII';
   w_ins(i).COLJ :='AAAAAAAAAAAAAAAAAAAAAAAAAA';
END LOOP;
   FORALL i in 1..1000000 INSERT INTO MIGTABLE VALUES w_ins(i);
   COMMIT;
END;
/
 
PL/SQL procedure successfully completed.

 

 

테이블 건수 확인

1
2
3
4
5
SQL> select count(*) from miguser.migtable;
 
  COUNT(*)
----------
   1000000

 

 

asis 서버 플랫폼 확인

1
2
3
4
5
SQL> select platform_name from v$database;
 
PLATFORM_NAME
---------------------
Linux x86 64-bit

리눅스임

 

 

Violation Check(tts전 유효성 검사)

1
2
3
4
5
6
7
8
9
SQL> 
conn / as sysdba
exec dbms_tts.transport_set_check('MIGTS', TRUE);
 
PL/SQL procedure successfully completed.
 
SQL> select * from transport_set_violations;
 
no rows selected

 

 

결과가 안나옴, 만약 결과가 나오는 경우 해당 데이터를 tts 대상 ts로 이동시켜줘야함

 

 

asis Block Change Tracking 설정(선택)
*필수 사항은 아님(증분 백업 향상을 위해 설정)

1
2
3
SQL> alter database enable block change tracking using file '/home/oracle/bct/bct.txt';
 
Database altered.

 

 

asis에서 db 이관 대상 테이블스페이스 백업

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ rman target /
RMAN> backup as copy incremental level 0 tag 'full_backup' tablespace migts format '/oraimsi/rman/rman_level0_%T_%U.bk';
backup as copy incremental level 0 tag 'full_backup' tablespace migts format '/oraimsi/rman/rman_level0_%T_%U.bk';
Starting backup at 2026-01-10 22:28:07
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=273 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00006 name=/oraimsi/oradata/migts01.dbf
output file name=/oraimsi/rman/rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-6_0f4dirbn.bk tag=FULL_BACKUP RECID=9 STAMP=1222208888
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile copy
input datafile file number=00007 name=/oraimsi/oradata/migts02.dbf
output file name=/oraimsi/rman/rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-7_0g4dirbo.bk tag=FULL_BACKUP RECID=10 STAMP=1222208889
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2026-01-10 22:28:09
 
Starting Control File and SPFILE Autobackup at 2026-01-10 22:28:09
piece handle=/app/oracle/product/19c/dbs/c-1166340695-20260110-05 comment=NONE
Finished Control File and SPFILE Autobackup at 2026-01-10 22:28:10

 

 

백업 파일 tobe 서버로 전송

1
2
3
4
$ cd /oraimsi/rman
$ scp /oraimsi/rman/rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-*.bk 192.168.137.60:/oradata1/rman/
rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-6_0f4dirbn.bk              100%  500MB 309.3MB/s   00:01
rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-7_0g4dirbo.bk              100%  500MB 405.0MB/s   00:01

 

 

tobe 서버에서 datafile 이름 규칙에 맞게 백업파일 복제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ cd /oradata1/rman
$ cp rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-6_0f4dirbn.bk /oradata2/BIGDB/migts01.dbf
$ cp rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-7_0g4dirbo.bk /oradata2/BIGDB/migts02.dbf
$ ls -al /oradata2/BIGDB
total 297583644
drwxr-x--- 2 oracle oinstall          279 Jan 10 22:25 .
drwxrwxr-x 6 oracle dba              4096 Oct 28 17:54 ..
-rw-r----- 1 oracle oinstall     10600448 Jan 10 22:28 control01.ctl
-rw-r----- 1 oracle oinstall     10600448 Jan 10 22:28 control02.ctl
-rw-r----- 1 oracle oinstall    524296192 Jan 10 22:28 migts01.dbf  <<--
-rw-r----- 1 oracle oinstall    524296192 Jan 10 22:28 migts02.dbf  <<--
-rw-r----- 1 oracle oinstall    104865792 Jan 10 22:25 otherts01.dbf
-rw-r----- 1 oracle oinstall  10737418752 Jan 10 21:56 redo01.log
-rw-r----- 1 oracle oinstall  10737418752 Jan 10 21:56 redo02.log
-rw-r----- 1 oracle oinstall  10737418752 Jan 10 22:28 redo03.log
-rw-r----- 1 oracle oinstall   1073750016 Jan 10 22:25 sysaux01.dbf
-rw-r----- 1 oracle oinstall   1073750016 Jan 10 22:15 system01.dbf
-rw-r----- 1 oracle oinstall  53687099392 Jan 10 21:57 temp01.dbf
-rw-r----- 1 oracle oinstall 214748372992 Jan 10 21:56 testts01.dbf
-rw-r----- 1 oracle oinstall  53687099392 Jan 10 22:27 undotbs01.dbf
-rw-r----- 1 oracle oinstall    524296192 Jan 10 21:56 users01.dbf

 

 

참고용 스크립트
cp 커맨드 생성 구문(백업 tag 및 tobe dbf 경로만 수정하여 작업시 사용가능)

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL>
select 'cp ' || a.fname || ' ' || b.file_name cmd
from v$backup_files a, dba_data_files b
where a.file_type = 'DATAFILE'
and a.tag = 'FULL_BACKUP'
and a.completion_time > trunc(sysdate)
and a.df_file# = b.file_id
order by a.df_file#;
 
CMD
------------------------------------------------------------------------------------------------------------------------------------------
cp /oraimsi/rman/rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-6_0f4dirbn.bk /oraimsi/oradata/migts01.dbf
cp /oraimsi/rman/rman_level0_20260110_data_D-ORA19DBF_I-1166340695_TS-MIGTS_FNO-7_0g4dirbo.bk /oraimsi/oradata/migts02.dbf

 

 

tobe 서버에 다른 테이블스페이스 생성 및 유저 생성
*asis와 같은 유저를 생성하고 default 테이블스페이스는 다른 ts로 설정해둠
샘플 테이블스페이스 생성

1
2
3
4
5
6
7
8
9
10
11
SQL> create tablespace otherts datafile '/oradata2/BIGDB/otherts01.dbf' size 100m;
 
Tablespace created.
 
SQL> create user miguser identified by miguser account unlock default tablespace otherts quota unlimited on otherts;
 
User created.
 
SQL> grant resource, connect, dba to miguser;
 
Grant succeeded.

 

 

tobe 서버 플랫폼 확인

1
2
3
4
5
SQL> select platform_name from v$database;
 
PLATFORM_NAME
---------------------
Linux x86 64-bit

동일하게 리눅스임

 

 

asis에서 증분 데이터 생성

1
2
3
4
5
6
7
8
9
SQL> 
conn miguser/miguser
insert into miguser.migtable select * from miguser.migtable where rownum <= 1000000;
 
1000000 rows created.
 
SQL> commit;
 
Commit complete.

 

 

테이블 건수 확인

1
2
3
4
5
SQL> select count(*) from miguser.migtable;
 
  COUNT(*)
----------
   2000000

100만건이 추가됨

 

 

asis에서 증분 백업 수행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
RMAN> backup incremental level 1 tag 'lv1_backup' tablespace migts format '/oraimsi/rman/rman_level1_%T_%U.inc';
backup incremental level 1 tag 'lv1_backup' tablespace migts format '/oraimsi/rman/rman_level1_%T_%U.inc';
Starting backup at 2026-01-10 22:31:15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=274 device type=DISK
channel ORA_DISK_1: starting incremental level 1 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/oraimsi/oradata/migts01.dbf
input datafile file number=00007 name=/oraimsi/oradata/migts02.dbf
channel ORA_DISK_1: starting piece 1 at 2026-01-10 22:31:15
channel ORA_DISK_1: finished piece 1 at 2026-01-10 22:31:16
piece handle=/oraimsi/rman/rman_level1_20260110_0i4dirhj_18_1_1.inc tag=LV1_BACKUP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2026-01-10 22:31:16
 
Starting Control File and SPFILE Autobackup at 2026-01-10 22:31:17
piece handle=/app/oracle/product/19c/dbs/c-1166340695-20260110-06 comment=NONE
Finished Control File and SPFILE Autobackup at 2026-01-10 22:31:18

 

 

증분 백업 파일 tobe 서버로 전송

1
2
3
$ cd /oraimsi/rman
$ scp rman_level1_20260110_0i4dirhj_18_1_1.inc 192.168.137.60:/oradata1/rman/
rman_level1_20260110_0i4dirhj_18_1_1.inc                100%  175MB 177.2MB/s   00:00

 

 

tobe에서 첫번째 증분 백업본 recover 수행
*dfnumber, toname, handle 이름만 수정하여 사용, dbf가 여러개인 경우 applyDatafileTo 구문이 있는 라인을 여러번 사용하면됨
*dfnumber에는 데이터파일 번호를, toname에는 tobe에서 데이터파일 경로를, handle에는 증분 백업 경로를 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SQL> 
set serveroutput on
DECLARE
    d varchar2(512);
    h varchar2(512);
    t varchar2(30);
    b1 boolean;
    b2 boolean;
    DONE boolean;
    FAILOVER boolean;
BEGIN
    d := sys.dbms_backup_restore.deviceAllocate;
    dbms_output.put_line(d);
    sys.dbms_backup_restore.applysetdatafile(check_logical=>false, cleanup=>false);
    sys.dbms_backup_restore.applyDatafileTo(dfnumber=>6, toname => '/oradata2/BIGDB/migts01.dbf',
    fuzziness_hint=>0,max_corrupt =>0,islevel0=>0,recid=>0,stamp=>0);
    sys.dbms_backup_restore.applyDatafileTo(dfnumber=>7, toname => '/oradata2/BIGDB/migts02.dbf',
    fuzziness_hint=>0,max_corrupt =>0,islevel0=>0,recid=>0,stamp=>0);
    sys.dbms_backup_restore.restoreSetPiece(handle=>'/oradata1/rman/rman_level1_20260110_0i4dirhj_18_1_1.inc',
    tag=>null,fromdisk=>true,recid=>0,stamp=>0);
    sys.dbms_backup_restore.restoreBackupPiece( done=>DONE, params=>null, outhandle=>h, outtag=>t, FAILOVER=>FAILOVER);
    sys.dbms_backup_restore.restoreCancel(TRUE);
    sys.dbms_backup_restore.deviceDeallocate;
END;
/
 
PL/SQL procedure successfully completed.

 

 

asis에서 두번째 증분 데이터 생성

1
2
3
4
5
6
7
8
9
SQL> 
conn miguser/miguser
insert into miguser.migtable select * from miguser.migtable where rownum <= 1000000;
 
1000000 rows created.
 
SQL> commit;
 
Commit complete.

 

 

테이블 건수 확인

1
2
3
4
5
SQL> select count(*) from miguser.migtable;
 
  COUNT(*)
----------
   3000000

100만건이 추가됨

 

 

asis 테이블스페이스를 read only 모드로 변경(down time 시작)

1
2
3
SQL> alter tablespace MIGTS read only;
 
Tablespace altered.

 

 

asis에서 두번째 증분 백업 수행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
RMAN> backup incremental level 1 tag 'lv1_backup' tablespace migts format '/oraimsi/rman/rman_level1_%T_%U.inc';
backup incremental level 1 tag 'lv1_backup' tablespace migts format '/oraimsi/rman/rman_level1_%T_%U.inc';
Starting backup at 2026-01-10 22:34:13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=273 device type=DISK
channel ORA_DISK_1: starting incremental level 1 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/oraimsi/oradata/migts01.dbf
input datafile file number=00007 name=/oraimsi/oradata/migts02.dbf
channel ORA_DISK_1: starting piece 1 at 2026-01-10 22:34:13
channel ORA_DISK_1: finished piece 1 at 2026-01-10 22:34:14
piece handle=/oraimsi/rman/rman_level1_20260110_0k4dirn5_20_1_1.inc tag=LV1_BACKUP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2026-01-10 22:34:14
 
Starting Control File and SPFILE Autobackup at 2026-01-10 22:34:14
piece handle=/app/oracle/product/19c/dbs/c-1166340695-20260110-07 comment=NONE
Finished Control File and SPFILE Autobackup at 2026-01-10 22:34:15

 

 

두번쨰 증분 백업 파일 tobe 서버로 전송

1
2
3
$ cd /oraimsi/rman
$ scp rman_level1_20260110_0k4dirn5_20_1_1.inc 192.168.137.60:/oradata1/rman/
rman_level1_20260110_0k4dirn5_20_1_1.inc               100%  175MB 193.7MB/s   00:01

 

 

tobe에서 두번째 증분 백업본 최종 recover 수행
*dfnumber, toname, handle 이름만 수정하여 사용, dbf가 여러개인 경우 applyDatafileTo 구문이 있는 라인을 여러번 사용하면됨
*dfnumber에는 데이터파일 번호를, toname에는 tobe에서 데이터파일 경로를, handle에는 증분 백업 경로를 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SQL> 
set serveroutput on
DECLARE
    d varchar2(512);
    h varchar2(512);
    t varchar2(30);
    b1 boolean;
    b2 boolean;
    DONE boolean;
    FAILOVER boolean;
BEGIN
    d := sys.dbms_backup_restore.deviceAllocate;
    dbms_output.put_line(d);
    sys.dbms_backup_restore.applysetdatafile(check_logical=>false, cleanup=>false);
    sys.dbms_backup_restore.applyDatafileTo(dfnumber=>6, toname => '/oradata2/BIGDB/migts01.dbf',
    fuzziness_hint=>0,max_corrupt =>0,islevel0=>0,recid=>0,stamp=>0);
    sys.dbms_backup_restore.applyDatafileTo(dfnumber=>7, toname => '/oradata2/BIGDB/migts02.dbf',
    fuzziness_hint=>0,max_corrupt =>0,islevel0=>0,recid=>0,stamp=>0);
    sys.dbms_backup_restore.restoreSetPiece(handle=>'/oradata1/rman/rman_level1_20260110_0k4dirn5_20_1_1.inc',
    tag=>null,fromdisk=>true,recid=>0,stamp=>0) ;
    sys.dbms_backup_restore.restoreBackupPiece( done=>DONE, params=>null, outhandle=>h, outtag=>t, FAILOVER=>FAILOVER);
    sys.dbms_backup_restore.restoreCancel(TRUE);
    sys.dbms_backup_restore.deviceDeallocate;
END;
/
 
PL/SQL procedure successfully completed.

 

 

asis에서 TTS 대상 테이블스페이스 export

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SQL> create or replace directory tts_dir as '/app/oracle/tts';
 
Directory created.
 
$ expdp system/oracle dumpfile=expdp_tts.dmp logfile=expdp_tts.log directory=tts_dir transport_tablespaces=MIGTS
 
Export: Release 19.0.0.0.0 - Production on Sat Jan 10 22:35:51 2026
Version 19.27.0.0.0
 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01":  system/******** dumpfile=expdp_tts.dmp logfile=expdp_tts.log directory=tts_dir transport_tablespaces=MIGTS
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
  /app/oracle/tts/expdp_tts.dmp
******************************************************************************
Datafiles required for transportable tablespace MIGTS:
  /oraimsi/oradata/migts01.dbf
  /oraimsi/oradata/migts02.dbf
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at Sat Jan 10 22:36:20 2026 elapsed 0 00:00:24

 

 

dump 파일 tobe로 전송

1
2
3
$ cd /app/oracle/tts
$ scp expdp_tts.dmp 192.168.137.60:/oradata1/tts
expdp_tts.dmp               100%  184KB   4.3MB/s   00:00

 

 

tobe에서 TTS 대상 테이블스페이스 import

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL> create or replace directory tts_dir as '/oradata1/tts';
 
Directory created.
 
$ impdp system/oracle dumpfile=expdp_tts.dmp logfile=impdp_tts.log \
directory=tts_dir transport_datafiles='/oradata2/BIGDB/migts01.dbf','/oradata2/BIGDB/migts02.dbf'
 
Import: Release 19.0.0.0.0 - Production on Sat Jan 10 22:44:40 2026
Version 19.27.0.0.0
 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01":  system/******** dumpfile=expdp_tts.dmp logfile=impdp_tts.log directory=tts_dir transport_datafiles=/oradata2/BIGDB/migts01.dbf,/oradata2/BIGDB/migts02.dbf
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at Sat Jan 10 22:44:56 2026 elapsed 0 00:00:15

 

 

tobe에서 tts 대상 테이블스페이스 read write 모드로 변경(down time 끝)

1
2
3
SQL> alter tablespace MIGTS read write;
 
Tablespace altered.

 

 

tobe에서 임시로 지정했던 default tablespace 변경

1
2
3
SQL> alter user miguser default tablespace migts;
 
User altered.

 

 

tobe에서 데이터 건수 확인

1
2
3
4
5
6
7
SQL> 
conn miguser/miguser
select count(*) from miguser.migtable;
 
  COUNT(*)
----------
   3000000

정상적으로 300만건이 확인됨

 

 

참고용. tts impdp 시 수행되는 ddl 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
$ impdp system/oracle dumpfile=expdp_tts.dmp logfile=impdp_tts_ddl.log \
directory=tts_dir transport_datafiles='/oradata2/BIGDB/migts01.dbf','/oradata2/BIGDB/migts02.dbf' sqlfile=tts_impdp_ddl.sql
 
$ cat tts_impdp_ddl.sql
-- CONNECT SYSTEM
ALTER SESSION SET EVENTS '10150 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10904 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '25475 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10407 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10851 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '22830 TRACE NAME CONTEXT FOREVER, LEVEL 192 ';
ALTER SESSION SET EVENTS '44405 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '44406 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SYS.DBMS_PLUGTS.PLTS_NEWDATAFILE('/oradata2/BIGDB/migts01.dbf');
SYS.DBMS_PLUGTS.PLTS_NEWDATAFILE('/oradata2/BIGDB/migts02.dbf');
-- new object type path: TRANSPORTABLE_EXPORT/PLUGTS_BLK
 
BEGIN
 sys.dbms_plugts.beginImport ('19.27.0.0.0',846,'2000',13,'Linux x86 64-bit',25851,358151,1,0,0,0);
COMMIT;
END;
/
 
BEGIN
 sys.dbms_plugts.checkCompType('COMPATSG','19.0.0.0.0');
COMMIT;
END;
/
 
BEGIN
 sys.dbms_plugts.checkUser('MIGUSER');
COMMIT;
END;
/
 
BEGIN
 sys.dbms_plugts.beginImpTablespace('MIGTS',5,'SYS',2,0,8192,2,1123213,1,2147483645,8,128,8,0,1,2147483645,8,1166340695,1,4129,1115922,NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,0);
COMMIT;
END;
/
 
BEGIN
 sys.dbms_plugts.checkDatafile(NULL,1166340695,6,64000,5,6,0,0,1115930,1123213,1,25165826,0,NULL,NULL);
COMMIT;
END;
/
 
BEGIN
 sys.dbms_plugts.checkDatafile(NULL,1166340695,7,64000,5,7,0,0,1115944,1123213,1,29360130,0,NULL,NULL);
COMMIT;
END;
/
 
BEGIN
 sys.dbms_plugts.commitPluggable;
COMMIT;
END;
/
-- new object type path: TRANSPORTABLE_EXPORT/TABLE
CREATE TABLE "MIGUSER"."MIGTABLE"
   (    "COLA" VARCHAR2(20 BYTE),
        "COLB" NUMBER,
        "COLC" NUMBER,
        "COLD" VARCHAR2(30 BYTE),
        "COLE" VARCHAR2(30 BYTE),
        "COLF" VARCHAR2(30 BYTE),
        "COLG" NUMBER,
        "COLH" VARCHAR2(30 BYTE),
        "COLI" VARCHAR2(30 BYTE),
        "COLJ" VARCHAR2(30 BYTE)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(SEG_FILE 6 SEG_BLOCK 130 OBJNO_REUSE 25741
  INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MIGTS" ;
 
BEGIN
  SYS.DBMS_PLUGTSP.PATCHTABLEMETADATA('MIGUSER','MIGTABLE',:1,:2,:3);
END;
/
 
BEGIN
  SYS.DBMS_PLUGTSP.PATCHDICTIONARY('MIGUSER','MIGTABLE',536870912,'unused','unused','unused','unused',2);
END;
/
 
 
BEGIN
  SYS.DBMS_PLUGTSP.PATCHDICTIONARY('MIGUSER','MIGTABLE',736,'unused','unused','unused','unused',3);
END;
/
 
-- new object type path: TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICS
-- new object type path: TRANSPORTABLE_EXPORT/STATISTICS/MARKER
-- new object type path: TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
 
BEGIN
 sys.dbms_plugts.endImport;
COMMIT;
END;
/

 

 

결론 : tts 방식을 이용해 테이블스페이스 레벨로 이관이 가능함 그리고 버전이 달라도(11gR2 to 19c) 이 방식을 이용해 이관이 가능함
테이블스페이스가 많아지고, 데이터파일이 많은 경우에는 위 방식을 스크립트를 이용해 자동화를 하는것이 편함
본문에서는 프로시저, 트리거 등 세그먼트가 아닌 오브젝트는 이관하지 않았는데 이런 오브젝트는 datapump의 content=metadata_only 옵션을 이용해서 이관해주면됨

 

 

참조 : 

https://positivemh.tistory.com/1326

How to Fix Transport Set Check Violations (DBMS_TTS.TRANSPORT_SET_CHECK)(ORA-39908, ORA-39910, ORA-39932, ORA-39921, etc.)(KB109933)
Primary Note for Transportable Tablespaces (TTS) -- Common Questions and Issues(KB134974)
Best Practices for Using Transportable Tablespaces (TTS)(KB130949)
트랜스포터블 테이블스페이스에 대한 프라이머리 노트 - 일반적인 질문 및 이슈들(KB134974)
트랜스포터블 테이블스페이스 (TTS) 제약사항, 제한: 세부사항, 참조, 그리고 적용 가능한 버젼(KB86037)
이동가능한 테이블스페이스(Transportable Tablespaces-TTS)를 사용하기 위한 모범기준(KB130949)
V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup(KB147608)
M5 Cross Endian Platform Migration using Full Transportable Data Pump Export/Import and RMAN Incremental Backups(KB144840)
https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-BF7A7711-499D-4E54-A3E9-D51950E562B2
https://docs.oracle.com/ko/learn/ocidb-xtts/index.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/spmdu/general-limitations-on-transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173
https://docs.oracle.com/en/database/oracle/oracle-database/19/spmdu/task-1-pick-a-self-contained-set-of-tablespaces.html#GUID-BF7A7711-499D-4E54-A3E9-D51950E562B2
https://docs.oracle.com/en/database/oracle/oracle-database/19/rcmrf/CONVERT.html#GUID-AD252F46-DD9E-4E2C-BF0E-DF2A4C7590C9
Migrate Database From 11g To 19c Using TTS With Less Storage In Target Database (Doc ID 2955663.1)
https://blog.goodusdata.com/190
https://bae9086.tistory.com/7
https://medium.com/garimoo/tts-transportable-tablespace-%EA%B8%B0%EB%8A%A5%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%98%A4%EB%9D%BC%ED%81%B4db-%EB%B2%84%EC%A0%84-%EC%97%85%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C-c1203004612c
https://jack-of-all-trades.tistory.com/534
https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/migrate-bulky-oracle-databases/migrate-bulky-oracle-databases.pdf