PDB 환경에서 EXPORT 및 IMPORT 관련

안녕하세요
Surmin 입니다.

오늘은 PDB 환경에서 EXPORT 및 IMPORT 방법에 대해 알아보겠습니다. 참고 부탁드립니다.

TEST

#CDB유저 생성 및 권한부여 
CREATE USER C##PDB_TEST IDENTIFIED BY 1234;
GRANT RESOURCE, CONNECT TO C##PDB_TEST;

테이블스페이스 생성

CREATE TABLESPACE TEST_TBS
DATAFILE '/app/oracle/oradata/ORCL/test_tbs01.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

--쿼터할당
ALTER USER C##PDB_TEST QUOTA UNLIMITED ON TEST_TBS;


--테이블 생성
CREATE TABLE C##PDB_TEST.emp_test1 (
    emp_id NUMBER PRIMARY KEY,
    emp_name VARCHAR2(50),
    dept VARCHAR2(30)
) TABLESPACE TEST_TBS;

--데이터 입력
INSERT INTO C##PDB_TEST.emp_test1 VALUES (1, 'hone', 'sdae');
INSERT INTO C##PDB_TEST.emp_test1 VALUES (2, 'dnge', 'donq');
commit;

--테이터 확인
select * from  C##PDB_TEST.emp_test1;

    EMP_ID EMP_NAME
---------- --------------------------------------------------
DEPT
------------------------------
         1 hone
sdae

         2 dnge
donq

아카이브 설정

[oracle@ORA19C ~]$ mkdir clone
[oracle@ORA19C clone]$ mkdir archive

alter system set log_archive_format = '%t_%s_%r.arc' scope=spfile;
alter system set log_archive_dest = '' scope = spfile;
alter system set log_archive_dest_1 = 'location=/home/oracle/clone/archive' scope = spfile;

shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

SQL>archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /home/oracle/clone/archive
Oldest online log sequence     17
Next log sequence to archive   19
Current log sequence           19

clone 절차

#컨트롤파일 생성문 백업
alter database backup controlfile to trace as '/home/oracle/re.sql';

#USERS는 필요없음 왜냐하면 TEST 테이블 복원을 할려고 하는것이기 때문에 
select distinct 'alter tablespace '||tablespace_name||' begin backup;' from dba_data_files;
==
'ALTERTABLESPACE'||TABLESPACE_NAME||'BEGINBACKUP;'
-------------------------------------------------------------
alter tablespace SYSAUX begin backup;
alter tablespace SYSTEM begin backup;
alter tablespace TEST_TBS begin backup;
alter tablespace UNDOTBS1 begin backup;
alter tablespace USERS begin backup;
==

!cp -av /app/oracle/oradata/ORCL/*.dbf /home/oracle/clone/

select distinct 'alter tablespace '||tablespace_name||' end backup;' from dba_data_files;
==
'ALTERTABLESPACE'||TABLESPACE_NAME||'ENDBACKUP;'
-----------------------------------------------------------
alter tablespace TEST_TBS end backup;
alter tablespace SYSAUX end backup;
alter tablespace UNDOTBS1 end backup;
alter tablespace USERS end backup;
alter tablespace SYSTEM end backup;
==

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

--아카이브 clone db복사
[oracle@ORA19C clone]$ cp -av archive archive_clone
'archive' -> 'archive_clone'
'archive/1_19_1216590216.arc' -> 'archive_clone/1_19_1216590216.arc'
'archive/1_20_1216590216.arc' -> 'archive_clone/1_20_1216590216.arc'
'archive/1_21_1216590216.arc' -> 'archive_clone/1_21_1216590216.arc'


#init 파일 없으면 spfile 이용하여 만들기
[oracle@ORA19C dbs]$ cd $ORACLE_HOME/dbs
[oracle@ORA19C dbs]$ cp -av initorcl.ora initclone.ora
'initorcl.ora' -> 'initclone.ora'

#SID수정하기
##필요한 디렉터리 만들어주기 
[oracle@ORA19C dbs]$ vi initclone.ora
===
*.audit_file_dest='/app/oracle/admin/clone/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/app/oracle/oradata/clone/control01.ctl'
*.db_block_size=8192
*.db_name='clone'
*.db_recovery_file_dest='/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=17271m   
*.diagnostic_dest='/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=cloneXDB)'
*.enable_pluggable_database=true
*.local_listener='LISTENER_clone'
*.log_archive_dest=''
*.log_archive_dest_1='location=/home/oracle/clone/archive_clone' <-아카이브 경로 수정하기
*.log_archive_format='%t_%s_%r.arc'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=387m    <-PAG 값 크면 최소 값으로 수정하기 
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1158m                <-SGA 값 크면 최소 값으로 수정하기 
*.undo_tablespace='UNDOTBS1'
===
  • re.sql 파일 수정
    • 해당 부분에서 PDB부분은 다 제거한다.
    • 경로 변경 해준다.
vi /home/oracle/re.sql
==
CREATE CONTROLFILE SET DATABASE "clone" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/home/oracle/clone/redo01.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 2 '/home/oracle/clone/redo02.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 3 '/home/oracle/clone/redo03.log'  SIZE 200M BLOCKSIZE 512
DATAFILE
  '/home/oracle/clone/system01.dbf',
  '/home/oracle/clone/sysaux01.dbf',
  '/home/oracle/clone/undotbs01.dbf',
  '/home/oracle/clone/test_tbs01.dbf'
CHARACTER SET KO16KSC5601
;
==

#프롬프트창 하나 더 띄움 
export ORACLE_SID=clone
[oracle@oracle19c ~]$ sqlplus / as sysdba

SQL> startup nomount
--컨트롤 위치 확인
SQL> show parameter control
==

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
control_file_record_keep_time        integer
7
control_files                        string
/app/oracle/oradata/clone/cont
rol01.ctl
control_management_pack_access       string
DIAGNOSTIC+TUNING
==

--sql실행
SQL> @re.sql
==
Control file created.
==

SQL> recover database using backup controlfile until cancel;
ORA-00279: change 1485802 generated at 11/12/2025 01:19:36 needed for thread 1
ORA-00289: suggestion : /home/oracle/clone/archive_clone/1_19_1216590216.arc
ORA-00280: change 1485802 for thread 1 is in sequence #19


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: change 1485952 generated at 11/12/2025 01:22:45 needed for thread 1
ORA-00289: suggestion : /home/oracle/clone/archive_clone/1_20_1216590216.arc
ORA-00280: change 1485952 for thread 1 is in sequence #20
ORA-00278: log file '/home/oracle/clone/archive_clone/1_19_1216590216.arc' no
longer needed for this recovery


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
Media recovery cancelled.

⇒ 여기서 중요한 점은 hot backup은 꼭 한개 의 아카이브를 가지고 있어야 한다 없을 경우 현재의 redo 라도 있어야 한다 없으면 recover 실패한다.

(히든 파라미터를 사용하면 조금 다를 수 있음)

데이터 조회

SQL> alter database open resetlogs;

#Test 테이터 조회
set linesize 120
set pagesize 20
column emp_id   format 99999
column emp_name format a20
column dept     format a15
SELECT * FROM C##PDB_TEST.emp_test1;SQL> SQL> SQL> SQL> SQL>

EMP_ID EMP_NAME             DEPT
------ -------------------- ---------------
     1 hone                 sdae
     2 dnge                 donq

users TBS 없어도 잘보임 그리고 데이터 조회에 문제없음을 확인

SQL> SET LINESIZE 200
SQL> SET PAGESIZE 100
SQL> COL FILE_NAME FORMAT A60
SQL> COL TABLESPACE_NAME FORMAT A20
SQL> COL STATUS FORMAT A10
COL AUTOEXTENSIBLE FORMAT A5
SQL> SQL> COL ONLINE_STATUS FORMAT A10
SQL>
SELECT FILE_ID,
SQL>   2         FILE_NAME,
  3         TABLESPACE_NAME,
       BYTES/1024/1024 SIZE_MB,
  4    5         MAXBYTES/1024/1024/1024 MAX_GB,
  6         AUTOEXTENSIBLE AUTO,
       STATUS,
  7    8         ONLINE_STATUS
  9  FROM DBA_DATA_FILES
ORDER BY FILE_ID; 10

   FILE_ID FILE_NAME                                                    TABLESPACE_NAME         SIZE_MB     MAX_GB AUT STATUS     ONLINE_STA
---------- ------------------------------------------------------------ -------------------- ---------- ---------- --- ---------- ----------
         1 /home/oracle/clone/system01.dbf                              SYSTEM                      760 31.9999847 YES AVAILABLE  SYSTEM
         3 /home/oracle/clone/sysaux01.dbf                              SYSAUX                      550 31.9999847 YES AVAILABLE  ONLINE
         5 /home/oracle/clone/undotbs01.dbf                             UNDOTBS1                    340 31.9999847 YES AVAILABLE  ONLINE
         7 /app/oracle/product/19c/dbs/MISSING00007                     USERS                                          AVAILABLE  RECOVER
        12 /home/oracle/clone/test_tbs01.dbf                            TEST_TBS                    100  .48828125 YES AVAILABLE  ONLINE

temp 할당

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/home/oracle/clone/temp01.dbf' REUSE;

SET LINESIZE 200
SET PAGESIZE 50
COL FILE_NAME FORMAT A60
COL TABLESPACE_NAME FORMAT A20
COL AUTOEXTENSIBLE FORMAT A5

SELECT FILE_NAME,
       TABLESPACE_NAME,
       BYTES/1024/1024 SIZE_MB,
       MAXBYTES/1024/1024/1024 MAX_GB,
       AUTOEXTENSIBLE AUTO
FROM DBA_TEMP_FILES;

#auto 가 no일경우 ON 설정
ALTER DATABASE TEMPFILE '/home/oracle/clone/temp01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;  

FILE_NAME                                                    TABLESPACE_NAME         SIZE_MB     MAX_GB AUT
------------------------------------------------------------ -------------------- ---------- ---------- ---
/home/oracle/clone/temp01.dbf                                TEMP                         20          0 NO


#확인
SQL> SELECT FILE_NAME,
       TABLESPACE_NAME,
       BYTES/1024/1024 SIZE_MB,
       MAXBYTES/1024/1024/1024 MAX_GB,
       AUTOEXTENSIBLE AUTO
FROM DBA_TEMP_FILES;  2    3    4    5    6

FILE_NAME                                                    TABLESPACE_NAME         SIZE_MB     MAX_GB AUT
------------------------------------------------------------ -------------------- ---------- ---------- ---
/home/oracle/clone/temp01.dbf                                TEMP                         20 31.9999847 YES

clone에서 export

--디렉토리 확인
SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES;

expdp system/oracle schemas=C##PDB_TEST directory=DATA_PUMP_DIR logfile=expdp_test.log dumpfile=expdp_test.dmp
==
[oracle@ORA19C ~]$ expdp system/oracle schemas=C##PDB_TEST directory=DATA_PUMP_DIR logfile=expdp_test.log dumpfile=expdp_test.dmp

Export: Release 19.0.0.0.0 - Production on Wed Nov 12 02:17:41 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

Warning: Oracle Data Pump operations are not typically needed when connected to the root or seed of a container database. (CDB$ROOT에서 expdp/impdp는 일반적이지 않음) 

Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/******** schemas=C##PDB_TEST directory=DATA_PUMP_DIR logfile=expdp_test.log dumpfile=expdp_test.dmp
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
. . exported "C##PDB_TEST"."EMP_TEST1"                   5.945 KB       2 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /app/oracle/admin/orcl/dpdump/expdp_test.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Wed Nov 12 02:18:00 2025 elapsed 0 00:00:19
==
  • import 작업
    • 임시 계정 하나 만든 뒤 remap_schema 사용
CREATE USER C##PDB_TESTT IDENTIFIED BY 1234;
GRANT RESOURCE, CONNECT TO C##PDB_TESTT;

import 하는데 remap_schema 사용

impdp system/oracle schemas=C##PDB_TEST directory=DATA_PUMP_DIR logfile=impdp_test.log dumpfile=expdp_test.dmp remap_schema=C##PDB_TEST:C##PDB_TESTT
==
Import: Release 19.0.0.0.0 - Production on Wed Nov 12 02:23:52 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

Warning: Oracle Data Pump operations are not typically needed when connected to the root or seed of a container database.

Master table "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01":  system/******** schemas=C##PDB_TEST directory=DATA_PUMP_DIR logfile=impdp_test.log dumpfile=expdp_test.dmp remap_schema=C##PDB_TEST:C##PDB_TESTT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "C##PDB_TESTT"."EMP_TEST1"                  5.945 KB       2 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/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully completed at Wed Nov 12 02:24:08 2025 elapsed 0 00:00:14
==

조회 시 사용자(스키마) 만 다르고 데이터는 같음을 확인

SQL> select * from C##PDB_TESTT.EMP_TEST1;
EMP_ID EMP_NAME             DEPT
------ -------------------- ---------------
     1 hone                 sdae
     2 dnge                 donq
위로 스크롤