基于19C PDB创建方式(二)

来源:这里教程网 时间:2026-03-03 21:28:05 作者:

承接上篇,这里我们演示下插拔PDB和relocate PDB的方式。

插拔PDB

1 描述 在将可插拔数据库插入另一个CDB前,必须先将其从CDB中拔出。拔出是指使可插拔数据库不再与CDB关联,并生成一个描述可插拔数据库已拔出状态的XML文件。将来使用这个XML文件,可以将可插拔数据库插入到另一个CDB中。 2 插拔远程PDB 2.1 确定拔出的PDB SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> select con_id,name from v$containers;     CON_ID NAME ---------- --------------------          1 CDB$ROOT          2 PDB$SEED          3 ORCLPDB          4 SALESPDB 2.2 拔出PDB生成XML文件 SQL> alter pluggable database salespdb close immediate; Pluggable database altered. SQL> alter pluggable database salespdb unplug into '/home/oracle/salespdb.xml'; Pluggable database altered. $ ll salespdb.xml  -rw-r--r-- 1 oracle oinstall 7336 Jul 12 23:31 salespdb.xml 2.3 将XML文件拷贝到远端CDB 将其拷贝到远端的CDB中,并将其插入 $ scp salespdb.xml 192.168.238.57:/home/oracle/ 2.4插入前检查兼容性 在将可插拔数据库插入CDB前,必须检查可插拔数据库与CDB之间的兼容性。 DBMS_PDB软件包可以检查这些兼容性。 使用该软件包检查兼容性时,必须提供拔出可插拔数据库时创建的XML文件的名称和存储目录。 set serveroutput on declare hold_var boolean; begin hold_var := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file=> '/home/oracle/salespdb.xml'); if hold_var then dbms_output.put_line('YES'); else dbms_output.put_line('NO'); end if; end; / YES PL/SQL procedure successfully completed. 如果这两个数据库之间没有兼容性问题,运行这段代码会输出YES。如果存在兼容性问题,运行这段代码会输出NO。 查询PDB_PLUG_IN_VIOLATIONS视图,可以详细了解它们不兼容的原因。 2.5 将PDB的数据文件打包拷贝 数据文件打包: SQL> alter session set container=salespdb; Session altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /oracle/app/oradata/orcl/salespdb/system01.dbf /oracle/app/oradata/orcl/salespdb/sysaux01.dbf /oracle/app/oradata/orcl/salespdb/undotbs01.dbf /oracle/app/oradata/orcl/salespdb/users01.dbf $ tar cvf salespdb.tar.gz salespdb/ $ scp salespdb.tar.gz 192.168.238.57:/oracle/app/oradata/orcl/ 2.6在目的CDB中插入PDB $ sqlplus / as sysdba SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL>create pluggable database salespdb using '/home/oracle/salespdb.xml' Nocopy Tempfile reuse; Pluggable database created. 不指定nocopy将报错: ORA-65005: missing or invalid file name pattern for file - /oracle/app/oradata/orcl/salespdb/system01.dbf 不指定TEMPFILE REUSE将报错: ERROR at line 1: ORA-27038: created file already exists ORA-01119: error in creating database file '/oracle/app/oradata/orcl/salespdb/temp01.dbf' 3 插拔非CDB SQL> alter session set container=testpdb; Session altered. 必须运行该脚本后才可打开数据库: SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

Relocate PDB

1 描述 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 事务不会受到任何影响 2 流程 2.1确认重定位的PDB 源端: SQL> show pdbs;     CON_ID CON_NAME    OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------          2 PDB$SEED       READ ONLY  NO          3 PDB1           READ WRITE NO          4 PDB3           READ WRITE NO          5 SALESPDB       MOUNTED 目标端: SQL> show pdbs;     CON_ID CON_NAME     OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------          2 PDB$SEED       READ ONLY  NO          3 PDB1           MOUNTED          6 SALESPDB       READ WRITE NO 需求:将PDB3进行relocate至目标端 2.2创建DBLINK 在源端根容器下创建公有用户: SQL> create user c##test identified by test; User created. SQL> grant CREATE PLUGGABLE DATABASE to c##test container=all; SQL> grant create session,connect,resource,sysoper to c##test container=all; 在目标端创建DBLINK: SQL> create database link PDB3 connect to c##test identified by test using 'orcl2'; 在源端创建一个测试表: SQL> create table t1 (id number); Table created. SQL> insert into t1 values(1); 1 row created. SQL> commit; Commit complete. 2.3目标端relocate 目标端进行relocate: SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB3@PDB3 RELOCATE AVAILABILITY MAX; ERROR at line 1: ORA-65016: FILE_NAME_CONVERT must be specified SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB3@PDB3 RELOCATE AVAILABILITY MAX FILE_NAME_CONVERT=('/oracle/app/oradata/orcl/pdb3','/oracle/app/oradata/orcl/pdb3') Pluggable database created. 2.4源端与目标端状态对比 查看源端PDB3状态: SQL> show pdbs;     CON_ID CON_NAME                       OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------          2 PDB$SEED                       READ ONLY  NO          3 PDB1                           READ WRITE NO          4 PDB3                           READ WRITE NO          5 SALESPDB                       MOUNTED 查看目标端PDB3状态: SQL> show pdbs;     CON_ID CON_NAME                       OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------          2 PDB$SEED                       READ ONLY  NO          3 PDB1                           MOUNTED          4 PDB3                           MOUNTED          6 SALESPDB                       READ WRITE NO 在源端再开启一个事务: SQL> create table t2 as select * from dba_objects; Table created. SQL> insert into t2 select * from t2; 72703 rows created. SQL> /       145406 rows created. SQL> / 290812 rows created. SQL> commit; SQL> delete from t2; SQL> commit; Commit complete. SQL> create table t3 as select * from dba_objects; Table created. 2.5目标端PDB启动 目标端启动: SQL> alter session set container=pdb3; Session altered. SQL> alter database open;  alter database open  * ERROR at line 1: ORA-65106: Pluggable database #4 (PDB3) is in an invalid state. 使用CDB启动: SQL>alter pluggable database pdb3 open; 2.6源端与目标端状态再次对比 在源端查看PDB的状态: SQL> show pdbs;      CON_ID CON_NAME                       OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------          2 PDB$SEED                       READ ONLY  NO          3 PDB1                           MOUNTED          4 PDB3                           MOUNTED          5 SALESPDB                       MOUNTED 尝试在源端打开PDB3: SQL> alter pluggable database pdb3 open; alter pluggable database pdb3 open * ERROR at line 1: ORA-65086: cannot open/close the pluggable database 目标端 PDB状态: SQL> show pdbs;             CON_ID CON_NAME                       OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------          2 PDB$SEED                       READ ONLY  NO          3 PDB1                           MOUNTED          4 PDB3                           READ WRITE NO          6 SALESPDB                       READ WRITE NO SQL> alter session set container=pdb3; Session altered. SQL> select count(*) from t2;   COUNT(*)   ------------      0 SQL> select count(*) from t3;   COUNT(*)   ------------      72704 3 总结 1.在目标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可以对外提供服务。 2.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的零停机。

相关推荐

热文推荐