ITPub博客

首页 > 数据库 > Oracle > 基于19C PDB创建方式(二)

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

原创 Oracle 作者:梦夕林1992 时间:2025-02-10 18:32:47 0 删除 编辑

承接上篇,这里我们演示下插拔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的零停机。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29956245/viewspace-3071595/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-10-13

  • 博文量
    90
  • 访问量
    85386