在线迁移pdb的目的
某些情况下要对cdb进行升级、停机等操作,而其中的部分pdb需要保持对外提供服务,那么就可以将pdb迁移到其他的cdb上运行。在线迁移pdb是目前在不停机或者最短停机时间情况下移动pdb的最快方法,如果采用其他的拔下再插入的方式,那么就需要一定的停机时间。
将pdb在不同的数据中心移动时,或者从私有机房迁移到云上环境时,所有的数据都需要物理的移动。对于那些特别大的pdb来说,这个过程则会消耗较长的时间。而PDB在线迁移则可以完全的消除这些不便之处,在线迁移pdb的过程中,应用依然可以对外提供服务,也不需要改变应用的连接设置等。
在线迁移pdb的实现方式
前提条件:
本地cdb下用户必须有CREATE PLUGGABLE DATABASE
权限
远端CDB处于local undo模式和归档模式
本地要有指向远端cdb的数据链,数据链里配置的远端cdb用户必须有PLUGGABLE DATABASE
和SYSDBA
或SYSOPER
权限
两个数据库要有相同的字节顺序
如果本地CDB字符集是AL32UTF8,则远端字符集不限。否则两者的字符集必须一致
通过CREATE PLUGGABLE DATABASE
语句来将pdb从一个CDB中迁移到其他CDB当中。通过FROM
语句来指定当前pdb的位置,RELOCATE
语句来指定pdb是被迁移而不是之前说的克隆。在这些操作完成以后,pdb就会被添加到新的CDB当中,同时会将pdb相关的文件也移动过去。
另外在迁移的过程中,被迁移的库是可以处于读写模式下实时提供服务的,在传输和应用redo到新的位置过程中会自动将原pdb静止在旧位置。最后当pdb准备好了,则会将其在新位置上线。当pdb在线迁移完毕,当前指向新位置的的DML和DDL操作会暂停,而查询则不受影响。
必须要创建一个数据链来进行迁移操作,从本地cdb指向远端新位置所在的CDB。
也可以将cdb下的pdb迁移到另一个应用容器下作为容器pdb,也可以将应用容器下的pdb迁移到另一个应用容器下,也可以将一个不包含应用pdb的应用根节点迁移到应用容器下作为应用pdb
pdb迁移后,有两种方式处理连接,AVAILABILITY MAX和AVAILABILITY NORMAL。AVAILABILITY MAX可以将指向旧位置的连接重定向到新位置,而这种情况下又包含下面这些选项
如果系统采用Oracle Internet Directory (Oracle’s LDAP directory service),则连接信息会在一个中心区域进行更新而不是更新每个客户端的配置文件。
如果新位置pdb也采用的同样的监听,则新的连接会在迁移完成后自动路由到新的PDB位置
如果新位置pdb采用不同的监听,则需要配置local_listener
和remote_listener
参数来使用它们各自的监听进行交叉注册,位置的变换是无缝的,因为pdb服务器的可用性和位置都是通过监听自动注册的。
在线迁移pdb
远端cdb上新建用户,必须要有CREATE PLUGGABLE DATABASE
的权限
1 2 3 4 5 6 7 8 9 10 11 12 13 create user c#xb identified by xb container=all ;grant create session ,sysoper, create pluggable database to c#xb container=all ; # 必须本地undo模式和归档模式下 archive log list; col property_name for a30 col property_value for a30select property_name,property_value from database_properties where property_name='LOCAL_UNDO_ENABLED' ; PROPERTY_NAME PROPERTY_VALUE LOCAL_UNDO_ENABLED TRUE
本地cdb新建数据链
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 drop public database link to_remote;create public database link to_remote connect to c#xb identified by xb using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = stbyum)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = cdb1) ) )' ; # 测试数据链 sys@ORA12C> select * from dual@to_remote; D - X # 检查cdb的本地undo模式和archive log col property_name for a30 col property_value for a30select property_name,property_value from database_properties where property_name='LOCAL_UNDO_ENABLED' ; PROPERTY_NAME PROPERTY_VALUE LOCAL_UNDO_ENABLED TRUE archive log list;
在线迁移pdb
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 sys@ORA12C> create pluggable database pdb3 from pdb3@to_remote relocate; Pluggable database created. sys@ORA12C> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED 2 PDB$SEED READ ONLY NO 3 PDB12C READ WRITE NO 4 PDB3 MOUNTED # 这个时候本地新建的pdb3还是mount状态,而远端的pdb3还是读写,可以提供服务 sys@CDB1> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED 2 PDB$SEED READ ONLY NO 3 PDB3 READ WRITE NO sys@CDB1> alter session set container=pdb3;Session altered. sys@CDB1> select * from dual; D - X
而当将本地pdb3打开以后,远端的pdb3会自动drop掉
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 sys@ORA12C> alter pluggable database pdb3 open ; Pluggable database altered. sys@ORA12C> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED 2 PDB$SEED READ ONLY NO 3 PDB12C READ WRITE NO 4 PDB3 READ WRITE NO sys@ORA12C> select file#,name from v$datafile where con_id=4 ; FILE# NAME 134 /u01/app/oracle/oradata/ORA12C/8 C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_system_gk8xtgs6_.dbf 135 /u01/app/oracle/oradata/ORA12C/8 C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_sysaux_gk8xtgs7_.dbf 136 /u01/app/oracle/oradata/ORA12C/8 C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_undotbs1_gk8xtgs8_.dbf 137 /u01/app/oracle/oradata/ORA12C/8 C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_tbs1_gk8xtgs8_.dbf # 远端的pdb被清除了 sys@CDB1> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED 2 PDB$SEED READ ONLY NO sys@CDB1> select file#,name from v$datafile where con_id=3 ;no rows selected # 删除数据链drop public database link to_remote;