http://blog.itpub.net/26736162/viewspace-2284043/https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/relocating-a-pdb.html#GUID-75519361-3DA2-4558-A7E5-64BC16FAFC7D

This technique is the fastest way to move a PDB with minimal or no down time.

Oracle 12.2 新特性: Online PDB relocate (PDB hot move)
Relocating a PDB是Oracle在12C中推出的一种新的数据迁移方式,在采用Relocate时可以使用最短的停机时间在不同的CDB之间直接迁移PDB。
Oracle 12.1中Relocate迁移数据时,需要源库处于read only状态,但由于12.2中local undo的推出,可以实现完全在线迁移,源库的PDB在read-write模式下就可以Relocate到远端CDB中,源PDB中的DML事务不会受到任何影响,整个迁移过程中不需要导出导入元数据,其迁移方式比XTTS更加简单快捷。
在目标PDB执行“create pluggable database xxx relocate”完成后,源CDB和目标CDB会同时存在2个Relocate PDB,此时目标CDB中该PDB处于MOUNT状态,而源库的PDB仍然处于READ WRITE状态。当在目标CDB中的PDB执行OPEN时,源PDB会停止且Oracle会自动KILL掉源PDB连接的所有会话,并同步且应用源PDB的日志到目标PDB,同时也会回滚未提交的事务,应用完成后源PDB库的所有数据文件将会自动删除,源库会被删除,目标PDB可以对外提供服务。

如果在Relocate过程中使用AVAILABILITY模式进行Relocate,新的连接请求Oracle会将其发送新PDB上,则完全实现PDB迁移的零停机。

其实Relocate的机制就是Hot Clone+DBlink的增量恢复。
PDB relocate的基本实现方式hot clone和通过dblink的增量redo apply。在线Pdb Relocate需要在目标CDB中创建一个database link指向源库的CDB,需要DBLINK使用的common用户有create pluggable database的权限,relocate的AVAILABILITY(高用选项)有normal|max|high,当目标库使用create pluggable database relocate选项时,源库会一直在read-write open状态,甚至到create pdb的命令完成,源PDB(READ-WRITE OPEN)上的用户DML事务都不会有任何影响。当目标库的CREATE PDB RELOCATE完成时,会在源CDB和目标CDB存在2个relocate的PDB,只不过在目标CDB中该PDB是mount状态,此时源库的DML为生成更多的redo日志为后期的PDB切换,PDB的切换操作是在目标CDB中的PDB open read-write时,此时源PDB会暂停,并且KILL掉源PDB库连接的会话,同步并应用源库PDB的redo到目标PDB,并且应用undo数据回滚未提交的事务,当应用完成后源pdb库的所有数据文件将会自动删除,目标PDB事务继续,在这短暂的操作期间如果使用AVAILABILITY如果有新的连接请求,Oracle可以跳过连接到新PDB上,实现了移动PDB的零停机。
有一些基本的条件如源库和目标库是archivelog mode,并且local undo,和相同的字节码(endianness),相同的options和字符集或者目标库是源库的子集,如目标库是字符集是AL32UTF8,源库可以是任何字符集,当然这也是12.2的另一新特性(同一CDB中,不同的PDB可以使用不同的字符集,但是其限制是CDB必须是AL32UTF8)。
oracle pdb  relocate  实时迁移 - 图1
Relocate a PDB Into an Application Container
在使用RelocatePDB进行数据迁移时需要注意如下事项:
1.如果PDB被Relocate到的CDB的字符集不是AL32UTF8,那么源与目标字符集必须兼容。
2.源端与目标端的字节顺序必须相同。
3.连接的用户在CDB中必须拥有’CREATE PLUGGABLE DATABASE’的权限。
5.源端PDB必须为归档模式
6.源端PDB必须是local undo模式。
7.当指定AVAILABILITY MAX子句时,要求目标PDB与源PDB名字必须保持一致。

源库 目标库
版本 18.3 19.3
CDB的名称 orcl orcl
要克隆pdb的名称 fixfpdb du_fixfpdb
ip地址 192.168.5.124 192.168.5.129
存储方式 FS FS

1.源库创建测试pdb

  1. create pluggable database fixf_pdb from pdb ;

2.目标库创建到源库pdb 的dblink

  1. create public database link test18cpdb
  2. connect to system identified by "Oracle123"
  3. using '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.124)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = fixf_pdb)))';

3.源库给system 账户授权

  1. grant create pluggable database to system container=all;

4.目标库创建远程源库的pdb

此时源库的pdb和目标库的pdb都存在,源库为READ WRITE,目标库为MOUNT状态,此时可以在源库再多创建几个表,然后再在目标库执行OPEN操作。

  1. create pluggable database du_fixfpdb from fixf_pdb@test18cpdb relocate ;

5.打开目标库已经复制的pdb数据库

此时会发现源库的PDB已经被删除了,但是在目标端PDB打开的过程中,在源库的所有操作都已同步到目标库上了。
注意:pdb 已经打开但有错误

  1. SQL> alter pluggable database du_fixfpdb open;
  2. Warning: PDB altered with errors.

6.查询不同版本pdb 复制导致的错误

  1. SELECT to_char(time, 'YYYY-MM-DD HH24:MI:SS') time,
  2. NAME,
  3. CAUSE,
  4. TYPE,
  5. LINE,
  6. MESSAGE,
  7. STATUS,
  8. ACTION,
  9. CON_ID
  10. FROM PDB_PLUG_IN_VIOLATIONS
  11. where status='PENDING'
  12. order by time desc;

7.执行脚本处理

1、如果是相同版本迁移,则不需要执行此命令。
#2、可以加上-n表示并行数

  1. $ORACLE_HOME/bin/dbupgrade -c du_fixfpdb -n 4
  2. # $ORACLE_HOME/bin/dbupgrade -c 'PDB1 PDB2' #同时升级2个PDB

执行完成后重新打开pdb 则无报错