首页 > 数据库 > Oracle > 基于19C PDB创建方式(二)
承接上篇,这里我们演示下插拔PDB和relocate 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
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/ ,如需转载,请注明出处,否则将追究法律责任。