前言:日常运维过程中,特别是涉及到数据库迁移,在19c pdb库迁移过程中,涉及到pdb relocate和refresh两种方式,这两种方式对比ADG方式配置过程确实少了不少,但各种方式各有自己的前置条件,下面我们来测试下。
一、环境介绍
1、操作系统 orhel 7.9 x64
2、数据库:oracle 19c pdb库
3、源目库都采用omf方式存储文件,版本都一致,并开启归档模式
二、19c pdb refresh迁移
1、前置条件
- 源端和目标端数据库必须为归档模式
- 源端和目标端必须为local_undo多租户(database_properties where property_name=‘LOCAL_UNDO_ENABLED’)
- 源端和目标端需要同平台,字节顺序相同
- 确保目标库有足够的SGA/PGA内存分配给refresh过来的pdb
- 确保目标库磁盘组有足够的可用空间存放refresh过来的pdb
-
源库pdb的字符集要和目标CDB的字符集和国家字符集兼容,例如目标库是AL32UTF8的话,源库可以是ZHS16GBK,但是反过来就不行。
2、测试过程
源库:cdb下创建用户
create user c##dblk identified by oracle;
grant create any table,unlimited tablespace to c##dblk container=all;
目标库:编辑tnsnames.ora
pdb02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb02)
)
)
3、创建dblink
create public database link pdb01_links connect to c##dblk identified by oracle using '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =10.10.10.11)(PORT = 1521))(CONNECT_DATA=( DEDICATED)(SERVICE_NAME =pdb01)))';
检查dblink:
select instance_name from v$instance@pdb01_links;
4、目标库:建立pdb refresh库
SQL> create pluggable database pdb01 from pdb01@pdb01_links refresh mode every 1 minutes;
Pluggable database created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 MOUNTED
5、源库:应用关闭后,一致性关闭源库,并以read only方式打开(确保老库数据不会增加)
alter pluggable database pdb01 close immediate;
alter pluggable database pdb01 open read only;
6、目标库最后一次刷新
alter pluggable database pdb01 refresh;
7、检查目标库数据或关键表数据是否一致
8、激活目标库
alter pluggable database pdb01 refresh mode none;(刷新模式为none为不可逆操作)
alter pluggable database pdb01 open;
9、执行datapatch修复目标pdb库最新补丁
[oracle@db100 admin]$ $ORACLE_HOME/OPatch/datapatch -pdbs pdb01
SQL Patching tool version 19.3.0.0.0 Production on Fri Jan 2 20:05:17 2026
Copyright (c) 2012, 2019, Oracle. All rights reserved.
Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_86924_2026_01_02_20_05_18/sqlpatch_invocation.log
Connecting to database...OK
Gathering database info...done
10、解决Database option RAC mismatch: PDB installed version 19.0.0.0.0. CDB installed version NULL.(略)
三、19c pdb relocate
在使用RelocatePDB进行数据迁移时需要注意如下事项:
1.如果PDB被Relocate到的CDB的字符集不是AL32UTF8,那么源与目标字符集必须兼容。
2.源端与目标短的字节顺序必须相同。
3.连接的用户在CDB中必须拥有'CREATEPLUGGABLE DATABASE'的权限。
5.源端PDB必须为归档模式。
6.源端PDB必须是localundo模式。
7.当指定AVAILABILITY MAX字句时,要求目标PDB与源PDB名字必须保持一致。
=====================================================================================
1、源库:cdb下创建用户
create user c##dblk identified by oracle;
grant create session,sysoper,create pluggable database to c##dblk container=all;
2、目标库:配置tnsnames.ora
orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
3、目标库:创建dblink
create public database link orcl_links connect to c##dblk identified by oracle using 'orcl';(使用cdb的link,不是pdblink))
检查dblink:
select instance_name from v$instance@orcl_links;
4、现有源目库存储文件采用omf方式
5、通过relocate方式创建目标pdb库:
create pluggable database pdb01 from pdb01@orcl_links relocate;
6、检查源目库状态
源库:
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
5 PDB02 READ WRITE NO
SQL> select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ------ -------------------------------------------
2 PDB$SEED NORMAL NONE NONE
5 PDB02 NORMAL NONE NONE
目标库:
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 MOUNTED
SQL> select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRESH_MODE REFRESH_INTERVAL
---------- ---------------------------------------- ---------------------------------------- ------------------ ----------------
2 PDB$SEED NORMAL NONE
3 PDB01 RELOCATING NONE
7、源库创建测试数据
SQL> alter session set container=pdb01;
Session altered.
SQL> create table it (id number);
Table created.
SQL> insert into it values(1);
1 row created.
SQL> insert into it values(2);
SQL> select * from it;
ID
----------
1
2
SQL> create tablespace data11 datafile size 100m autoextend on;
Tablespace created.
SQL> select tablespace_name from dba_data_files;
TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
UNDO_2
USERS
DATA
DATA01
DATA11
8、目标库pdb01打开open状态
SQL> alter pluggable database pdb01 open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
alert.log日志信息:
alter pluggable database pdb01 open
2026-01-03T09:27:37.206519+08:00
Applying media recovery for pdb-4099 from SCN 6835327 to SCN 6836889
Remote log information: count-2
thr-2, seq-16, logfile-+DATA/ORCL/partial_archivelog/2026_01_03/thread_2_seq_16.338.1221557257, los-6817708, nxs-18446744073709551615
thr-1, seq-19, logfile-+DATA/ORCL/partial_archivelog/2026_01_03/thread_1_seq_19.340.1221557257, los-6547727, nxs-18446744073709551615
PDB01(3):Media Recovery Start
2026-01-03T09:27:37.207578+08:00
PDB01(3):Serial Media Recovery started
PDB01(3):max_pdb is 8
2026-01-03T09:27:37.706930+08:00
PDB01(3):Media Recovery Log +DATA/ORCL/partial_archivelog/2026_01_03/thread_1_seq_19.340.1221557257
2026-01-03T09:27:38.771488+08:00
PDB01(3):Media Recovery Log +DATA/ORCL/partial_archivelog/2026_01_03/thread_2_seq_16.338.1221557257
2026-01-03T09:27:40.854244+08:00
PDB01(3):Successfully added datafile 99 to media recovery
PDB01(3):Datafile #99: '/oradata/ORCL/334820967F541799E0630C0A0A0AE1B8/datafile/o1_mf_data11_nojw4chd_.dbf'
2026-01-03T09:27:40.958966+08:00
PDB01(3):Incomplete Recovery applied until change 6836889 time 01/03/2026 09:26:35
2026-01-03T09:27:40.965535+08:00
PDB01(3):Media Recovery Complete (orcl)
PDB01(3):Autotune of undo retention is turned on.
PDB01(3):Undo initialization finished serial:0 start:88332584 end:88332584 diff:0 ms (0.0 seconds)
PDB01(3):Database Characterset for PDB01 is AL32UTF8
2026-01-03T09:27:42.773895+08:00
PDB01(3):Opening pdb with no Resource Manager plan active
2026-01-03T09:28:14.357099+08:00
PDB01(3):JIT: pid 100844 requesting stop
PDB01(3):Buffer Cache flush started: 3
PDB01(3):Buffer Cache flush finished: 3
2026-01-03T09:28:19.621553+08:00
Applying media recovery for pdb-4099 from SCN 6836889 to SCN 6837594
Remote log information: count-2
thr-2, seq-16, logfile-+DATA/ORCL/partial_archivelog/2026_01_03/thread_2_seq_16.338.1221557299, los-6817708, nxs-18446744073709551615
thr-1, seq-19, logfile-+DATA/ORCL/partial_archivelog/2026_01_03/thread_1_seq_19.340.1221557299, los-6547727, nxs-18446744073709551615
PDB01(3):Media Recovery Start
2026-01-03T09:28:19.622572+08:00
PDB01(3):Serial Media Recovery started
PDB01(3):max_pdb is 8
2026-01-03T09:28:19.800936+08:00
PDB01(3):Media Recovery Log +DATA/ORCL/partial_archivelog/2026_01_03/thread_2_seq_16.338.1221557299
2026-01-03T09:28:19.933723+08:00
PDB01(3):Media Recovery Log +DATA/ORCL/partial_archivelog/2026_01_03/thread_1_seq_19.340.1221557299
2026-01-03T09:28:21.519872+08:00
PDB01(3):Incomplete Recovery applied until change 6837594 time 01/03/2026 09:26:35
2026-01-03T09:28:21.525384+08:00
PDB01(3):Media Recovery Complete (orcl)
PDB01(3):Undo initialization recovery: err:0 start: 88372497 end: 88372500 diff: 3 ms (0.0 seconds)
PDB01(3):[100844] Successfully onlined Undo Tablespace 2.
PDB01(3):Undo initialization online undo segments: err:0 start: 88372500 end: 88372523 diff: 23 ms (0.0 seconds)
PDB01(3):Undo initialization finished serial:0 start:88372497 end:88372527 diff:30 ms (0.0 seconds)
PDB01(3):Database Characterset for PDB01 is AL32UTF8
PDB01(3):Buffer Cache flush started: 3
PDB01(3):Buffer Cache flush finished: 3
2026-01-03T09:28:23.281010+08:00
PDB01(3):Undo initialization recovery: err:0 start: 88374182 end: 88374184 diff: 2 ms (0.0 seconds)
PDB01(3):[100844] Successfully onlined Undo Tablespace 2.
PDB01(3):Undo initialization online undo segments: err:0 start: 88374184 end: 88374267 diff: 83 ms (0.1 seconds)
PDB01(3):Undo initialization finished serial:0 start:88374182 end:88374270 diff:88 ms (0.1 seconds)
PDB01(3):Deleting old file#10 from file$
PDB01(3):Deleting old file#11 from file$
PDB01(3):Deleting old file#12 from file$
PDB01(3):Deleting old file#13 from file$
PDB01(3):Deleting old file#14 from file$
PDB01(3):Deleting old file#15 from file$
PDB01(3):Deleting old file#81 from file$
PDB01(3):Deleting old file#82 from file$
PDB01(3):Adding new file#92 to file$(old file#10). fopr-1, newblks-35840, oldblks-19200
PDB01(3):Adding new file#93 to file$(old file#11). fopr-1, newblks-44800, oldblks-15360
PDB01(3):Adding new file#94 to file$(old file#12). fopr-1, newblks-12800, oldblks-12800
PDB01(3):Adding new file#95 to file$(old file#13). fopr-1, newblks-12800, oldblks-12800
PDB01(3):Adding new file#96 to file$(old file#14). fopr-1, newblks-640, oldblks-640
PDB01(3):Adding new file#97 to file$(old file#15). fopr-1, newblks-12800, oldblks-12800
PDB01(3):Adding new file#98 to file$(old file#81). fopr-1, newblks-1280, oldblks-1280
PDB01(3):Adding new file#99 to file$(old file#82). newblks-12800, oldblks-12800
PDB01(3):Successfully created internal service PDB01 at open
****************************************************************
Post plug operations are now complete.
Pluggable database PDB01 with pdb id - 3 is now marked as NEW.
****************************************************************
9、检查源库状况
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
5 PDB02 READ WRITE NO
alert.log日志:
Domain Action Reconfiguration complete (total time 0.0 secs)
Decreasing priority of 1 RS
2026-01-03T09:28:15.771482+08:00
Pluggable database PDB01 closed
2026-01-03T09:28:22.592671+08:00
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/data11.339.1221557195
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/data01.335.1221507639
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/data.302.1221087139
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/users.285.1199038753
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/undo_2.284.1199038751
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/TEMPFILE/temp.283.1199038451
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/undotbs1.280.1199038445
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/sysaux.282.1199038445
Deleted Oracle managed file +DATA/ORCL/334820967F541799E0630C0A0A0AE1B8/DATAFILE/system.281.1199038445
Deleted Oracle managed file +DATA/ORCL/partial_archivelog/2026_01_03/thread_1_seq_19.340.1221557299
Deleted Oracle managed file +DATA/ORCL/partial_archivelog/2026_01_03/thread_2_seq_16.338.1221557299
2026-01-03T09:34:05.311053+08:00
Control autobackup written to DISK device
handle '+DATA/ORCL/AUTOBACKUP/2026_01_03/s_1221557644.338.1221557645'
源库pdb01从cdb中消失了。
小结:pdb refresh和pdb relocate两种迁移方式中最大的不同在于前者是完全复制源库到目的库,且源库不做任何操作,保持现状;
而relocate方式,将源库复制到目的库,但在源库中会将复制过来的pdb删除,在后面pdb迁移过程中,感觉pdb refresh可能会用
的多些。
2026.1.3
good luck