프린트 하기

OS 환경 : Oracle Linux 8.1 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c to 19c datapump impdp network_link 옵션 사용

본문에서는 dblink를 이용한 impdp 사용 방법에 대해 설명함
dblink를 이용한 datapump impdp이기때문에 expdp 없이 바로 명령어 사용이 가능함
이 경우 소스 db에서 expdp를 할 필요도 없고 dmp 파일이 생성되지도 않음
소스 db -> 타겟 db로 바로 impdp 하는 방식임

 

 

network_link 옵션 제약사항
- 소스와 대상 DB 버전 차이는 최대 두 버전까지만 허용함 (예시 : 12c <-> 11g, 10g 가능)
- impdp 실행 계정이 DATAPUMP_IMP_FULL_DATABASE 권한이 있으면, expdp 실행 계정도 DATAPUMP_EXP_FULL_DATABASE 권한 필요함
- Parallel Query(PQ) 및 메타데이터 병렬 처리 불가
- 암호화되지 않은 네트워크 링크 사용 시, 암호화된 데이터도 평문으로 전송됨
이외 제약사항은 공식문서 참고
참고 :

https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/datapump-import-utility.html#GUID-0871E56B-07EB-43B3-91DA-D1F457CF6182

 

 

db 정보
소스 데이터베이스 : 192.168.137.19 / sid : oracle19 / port : 1521
타겟 데이터베이스 : 192.168.137.100 / sid : targetdb

 

 

테스트
소스 데이터베이스 서버 리스너 기동

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
$ lsnrctl start
$ lsnrctl status
 
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 23-FEB-2025 20:48:23
 
Copyright (c) 1991, 2019, Oracle.  All rights reserved.
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                23-FEB-2025 19:53:57
Uptime                    0 days 0 hr. 54 min. 25 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora
Listener Log File         /ORA19/app/oracle/diag/tnslsnr/ora19/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora19)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "oracle19" has 1 instance(s).
  Instance "oracle19", status READY, has 1 handler(s) for this service...
Service "oracle19XDB" has 1 instance(s).
  Instance "oracle19", status READY, has 1 handler(s) for this service...
The command completed successfully

 

 

소스 데이터베이스에서 empmig 테이블 생성

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
SQL> create table empmig as select * from emp;
 
Table created.
 
SQL> update empmig set empno = 9999;
 
14 rows updated.
 
SQL> commit;
 
Commit complete.
 
SQL> set lines 200 pages 1000
SQL> select * from empmig;
 
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      9999 KING       PRESIDENT            17-NOV-81       5000                    10
      9999 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      9999 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      9999 JONES      MANAGER         7839 02-APR-81       2975                    20
      9999 SCOTT      ANALYST         7566 13-JUL-87       3000                    20
      9999 FORD       ANALYST         7566 03-DEC-81       3000                    20
      9999 SMITH      CLERK           7902 17-DEC-80        800                    20
      9999 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      9999 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      9999 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      9999 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      9999 ADAMS      CLERK           7788 13-JUL-87       1100                    20
      9999 JAMES      CLERK           7698 03-DEC-81        950                    30
      9999 MILLER     CLERK           7782 23-JAN-82       1300                    10
 
14 rows selected.

샘플 테이블이 정상적으로 생성됨

 

 

소스 데이터베이스에 존재하는 테이블 확인

1
2
3
4
5
6
7
SQL> select * from tab;
 
TNAME      TABTYPE        CLUSTERID
---------- ------------- ----------
EMPMIG     TABLE
DEPT       TABLE
EMP        TABLE

총 3개가 존재함

 

 

해당 테이블이 존재하는 테이블스페이스 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
set lines 200 pages 1000
col segment_name for a10
col tablespace_name for a10
select segment_name, tablespace_name from dba_segments
where segment_name in ('EMP', 'DEPT', 'EMPMIG')
and owner = 'IMSI';
 
SEGMENT_NA TABLESPACE
---------- ----------
DEPT       USERS
EMP        USERS
EMPMIG     USERS

모두 users 테이블스페이스에 존재함

 

 

유저의 quota 확인

1
2
3
4
5
6
7
8
9
10
11
SQL> 
set lines 200 pages 1000
col tablespace_name for a20
col username for a20
select * from dba_ts_quotas
where username = 'IMSI';
 
TABLESPACE_NAME      USERNAME                  BYTES  MAX_BYTES     BLOCKS MAX_BLOCKS DRO
-------------------- -------------------- ---------- ---------- ---------- ---------- ---
USERS                IMSI                     327680         -1         40         -1 NO
IMSITS               IMSI                          0         -1          0         -1 NO

현재 imsi 유저는 users, imsits 총 2개의 테이블스페이스에 quota가 존재함
참고 : 오라클 19c 유저별 테이블스페이스 quota 확인 및 변경 ( https://positivemh.tistory.com/1202 )

 

 

타겟 데이터베이스에서 tnsnames.ora에 소스 데이터베이스 정보 등록

1
2
3
4
5
6
7
8
9
10
$ cd $ORACLE_HOME/network/admin
$ vi tnsnames.ora
SOURCEDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.19)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oracle19)
    )
  )

 

 

tnsping 확인

1
2
3
4
5
6
7
8
9
10
11
12
$ tnsping SOURCEDB
 
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 23-FEB-2025 20:14:14
 
Copyright (c) 1997, 2019, Oracle.  All rights reserved.
 
Used parameter files:
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.19)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracle19)))
OK (0 msec)

정상적으로 tnsping이 동작함

 

 

소스 데이터베이스 접속 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ sqlplus system/"oracle"@sourcedb
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Feb 23 20:14:30 2025
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
Last Successful login time: Thu Feb 20 2025 15:15:30 +09:00
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
 
SQL> select instance_name, version, status from v$instance;
 
INSTANCE_NAME    VERSION           STATUS
---------------- ----------------- ------------
oracle19         19.0.0.0.0        OPEN

정상적으로 접속됨

 

 

타겟 데이터베이스에서 db링크 생성

1
2
3
4
5
6
7
8
9
SQL> create public database link mig_link connect to system identified by "oracle" using 'SOURCEDB';
 
Database link created.
 
SQL> select to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') dt from dual@mig_link;
 
DT
-------------------
2025/02/23 20:20:01

db링크로도 정상 접속됨

 

 

타겟 데이터베이스에서 imsi2 유저 생성

1
2
3
SQL>
create user imsi2 identified by imsi2 account unlock default tablespace users quota unlimited on users;
grant resource, connect to imsi2;

 

 

imsi2 유저 접속 후 테이블 확인

1
2
3
4
SQL> conn imsi2/imsi2
SQL> select * from tab;
 
no rows selected

현재 테이블이 존재하지 않음

 

 

dblink를 이용한 datapump impdp이기때문에 expdp 없이 바로 명령어 사용이 가능함
이 경우 소스 db에서 expdp를 할 필요도 없고 dmp 파일이 생성되지도 않음

 

 

타겟 데이터베이스에서 impdp 진행

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
$ impdp system/oracle network_link=mig_link schemas=imsi remap_schema=imsi:imsi2
 
Import: Release 19.0.0.0.0 - Production on Sun Feb 23 20:33:27 2025
Version 19.3.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_IMPORT_SCHEMA_01":  system/******** network_link=mig_link schemas=imsi remap_schema=imsi:imsi2
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type SCHEMA_EXPORT/USER
ORA-31684: Object type USER:"IMSI2" already exists
 
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
ORA-39083: Object type TABLESPACE_QUOTA:"IMSI2"."IMSITS" failed to create with error:
ORA-00959: tablespace 'IMSITS' does not exist
 
Failing sql is:
DECLARE   TEMP_COUNT NUMBER;   SQLSTR VARCHAR2(200); BEGIN   SQLSTR := 'ALTER USER "IMSI2" QUOTA UNLIMITED ON "IMSITS"';  EXECUTE IMMEDIATE SQLSTR;EXCEPTION   WHEN OTHERS THEN    IF SQLCODE = -30041 THEN       SQLSTR := 'SELECT COUNT(*) FROM USER_TABLESPACES               WHERE TABLESPACE_NAME = ''IMSITS'' AND CONTENTS = ''TEMPORARY''';      EXECUTE IMMEDIATE SQLSTR INTO TEMP_COUNT;      IF TEMP_COUNT = 1 THEN RETURN;       ELSE RAISE;       END IF;    ELSE      RAISE;    END IF;END;
 
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
. . imported "IMSI2"."DEPT"                                   4 rows
. . imported "IMSI2"."EMP"                                   14 rows
. . imported "IMSI2"."EMPMIG"                                14 rows
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" completed with 2 error(s) at Sun Feb 23 20:33:48 2025 elapsed 0 00:00:21

명령어 설명 :
system/oracle : 타겟 데이터베이스의 system 유저 이름과 패스워드
network_link=mig_link : 타겟 데이터베이스에서 만든 db링크 이름
schemas=imsi : 소스 데이터베이스의 유저 이름
remap_schema=imsi:imsi2 : 소스 데이터베이스의 imsi 유저의 테이블들을 타겟 데이터베이스의 imsi2에 넣겠다는 의미

 

 

현재 imsits가 타겟 데이터베이스에 존재하지 않기 때문에 이 테이블스페이스 quota를 imsi2유저에 부여할때 에러가 발생함
이외에는 에러가 발생하지 않고 잘 import 됨

 

 

타겟 데이터베이스에서 imsi2유저 테이블 확인

1
2
3
4
5
6
7
8
$ sqlplus imsi2/imsi2
SQL> select * from tab;
 
TNAME      TABTYPE        CLUSTERID
---------- ------------- ----------
EMPMIG     TABLE
DEPT       TABLE
EMP        TABLE

정상적으로 3개 테이블 다 들어옴

 

 

테이블 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> 
set lines 200 pages 1000
select * from empmig;
 
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      9999 KING       PRESIDENT            17-NOV-81       5000                    10
      9999 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      9999 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      9999 JONES      MANAGER         7839 02-APR-81       2975                    20
      9999 SCOTT      ANALYST         7566 13-JUL-87       3000                    20
      9999 FORD       ANALYST         7566 03-DEC-81       3000                    20
      9999 SMITH      CLERK           7902 17-DEC-80        800                    20
      9999 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      9999 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      9999 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      9999 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      9999 ADAMS      CLERK           7788 13-JUL-87       1100                    20
      9999 JAMES      CLERK           7698 03-DEC-81        950                    30
      9999 MILLER     CLERK           7782 23-JAN-82       1300                    10
 
14 rows selected.

정상적으로 import 됨

 

 

결론 :
impdp시 network_link 옵션을 사용하면 별도의 expdp 작업 및 dmp 파일을 생성하지 않고 바로 타겟db에 import가 가능함
하지만 병렬기능이 제대로 동작하지 않기 때문에 일반 expdp, impdp 보다는 많이 느릴 수 있음
대상 세그먼트 용량이 크면 클수록 네트워크 부하 및 시간이 오래 소요됨
만약 소스db 서버에 expdp 시 dmp 파일을 저장할 공간이 없는 경우 이 방식을 대안으로 사용할 수 있음

 

 

참조 : 

2807070.1, 1305166.1
https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/datapump-import-utility.html#GUID-0871E56B-07EB-43B3-91DA-D1F457CF6182
https://positivemh.tistory.com/734
https://positivemh.tistory.com/1017
https://positivemh.tistory.com/1202
https://blog.naver.com/pumba3/220667390732
https://emersontech.com.br/en/network_link/
https://cafe.naver.com/prodba/56084