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) 및 메타데이터 병렬 처리 불가
- 암호화되지 않은 네트워크 링크 사용 시, 암호화된 데이터도 평문으로 전송됨
이외 제약사항은 공식문서 참고
참고 :
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
'ORACLE > Migration' 카테고리의 다른 글
오라클 19c 핫백업을 이용한 다운타임 최소화 이관 (0) | 2025.05.11 |
---|---|
오라클 10g R2 에서 오라클 11g R2 수동 업그레이드 마이그레이션 방법 (0) | 2024.08.05 |
오라클 11g R2 에서 오라클 19c datapump schemas 옵션 이관시 주의사항 (2) | 2022.02.23 |
오라클 9i 에서 오라클 19c로 정통 export, import 마이그레이션 (1) | 2021.11.24 |
오라클 11g R2 에서 오라클 19c Datapump 마이그레이션 방법 (3) | 2021.06.09 |