点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!


oracle容器数据库


Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。
CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。
在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。
而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。
下面是官方文档关于CDB与PDB的关系图:

CDB组件(Components of a CDB)
一个CDB数据库容器包含了下面一些组件:
ROOT组件:ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。
SEED组件:Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。
PDBS:CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。


克隆PDB


CLONEDB 提供了一种方法,可以轻松快速地在网络附加存储上(NAS)创建数据库副本,使用数据库集成的配置方法:克隆生产数据库是一种常用技术,可以帮助开发和测试应用程序及其周围环境的更改。
在新的操作系统发布、存储软件或应用程序版本安装在生产环境之前,需要使用生产数据进行整体的测试。这通常是通过将生产数据库复制到测试环境来完成的。
此外,在测试环境中,生产数据库的副本也被制作到应用程序开发人员正在创建或修改应用程序并对其进行测试的开发环境中。所有这些副本都需要大量的存储来分配和管理。使用微小配置,CLONEDB大大减少了生产数据库克隆所需的存储量。
PDB克隆还可以用做应用程序的分离和主机更换,比如之前因为数据量小将两个程序的表放到同一个数据库,后来因为业务量增加需要将一个程序的表单独放到一个库内,这时候可以用PDB克隆方式进行分离,分离后将其他程序的表删除即可。主机跟换则是在新主机创建好容器数据库后将PDB通过远程克隆启用。


本地克隆PDB


1. PDB克隆需要满足归档模式和本地UNDO为启用状态
检查是否启用归档:

检查本地UNDO:

如果未开启归档模式和本地UNDO需要先启用。
开始克隆前停用业务保证数据一致并将原PDB设置为read only状态:
alter session set container=OLD_PDB;alter pluggable database OLD_PDB close immediate instances=all;alter pluggable database OLD_PDB OPEN READ ONLY;
克隆PDB:
create pluggable database NEW_PDB from OLD_PDB PARALLEL 6;
该过程LOD_PDB只有几百GB并且没有ADG的情况下10几分钟就可以完成。如果有ADG的情况下需要等备库同步完成才能正常启用NEW_PDB。
2. 克隆完成后需要启OLD_PDB和NEW_PDB
OLD_PDB:alter pluggable database OLD_PDB open READ WRITE;alter session set container=OLD_PDB;alter pluggable database OLD_PDB open;NEW_PDB:alter session set container=NEW_PDB;alter pluggable database NEW_PDB open;
检查是否存在失效对象并对比原库,如果有新增失效对象需要手动编译失效对象。
克隆完成删除多余的表后数据库分离成功(需要业务提供需要的表再进行过滤删除)。
select 'drop table '||owner||'.'||TABLE_NAME||' ;'FROM dba_tablesWHERE OWNER in ('username')AND TABLE_NAME NOT IN ('table_01','table_02');


非本地克隆PDB


1. 使用db_link方式克隆pdb
在老库创建c##link_pdb用户并授权:
create user c##link_pdb identified by linkpdb container=all;grant CREATE PLUGGABLE DATABASE to c##link_pdb container=all;grant connect,resource,cdb_dba,sysoper to c##link_pdb container=all;
在目标库创建TNS:
cd $ORACLE_HOME/network/adminold_pdb= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = old_pdb) ) )
创建db_link:
create database link new_pdb_link connect to c##link_pdb identified by linkpdb using 'old_pdb)';
克隆pdb:
alter session set pdb_file_name_convert='old_pdb','new_pdb';create pluggable database new_pdb from old_pdb@new_pdb_link;
克隆完成后开启OLD_PDB和NEW_PDB(与本地克隆方式一致)。
2. 使用插拔的方式克隆pdb
原库关闭NEW_PDB并生成XML文件:
alter pluggable database NEW_PDB close immediate instances=all;alter pluggable database NEW_PDB unplug into '/home/oracle/NEW_PDB.xml';
备份NEW_PDB库并将备份文件复制到目标库:
rman target set command id to 'NEW_PDB';BACKUP INCREMENTAL LEVEL 0 FOR TRANSPORT ALLOW INCONSISTENT PLUGGABLE DATABASE NEW_PDB FORMAT '/home/oracle/NEW_PDB.bak';
目标库恢复:
rman target /SET COMMAND ID TO 'NEW_PDB';RESTORE FOREIGN DATAFILE 00123 TO NEW,00124 TO NEW,00118 TO NEW,00119 TO NEW,00120 TO NEW,00122 TO NEW,00121 TO NEW FROM BACKUPSET '/home/oracle/NEW_PDB.bak';
将PDB插入到目标库CDB:
CREATE PLUGGABLE DATABASE NEW_CDB AS CLONE USING '/home/oracle/NEW_CDB.xml'SOURCE_FILE_NAME_CONVERT = ('+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/system.294.1099865729','+DATA/NEW_CDB/NEW_PDB/system01.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/sysaux.295.1099865729','+DATA/NEW_CDB/NEW_PDB/sysaux.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/undotbs1.299.1099865729','+DATA/NEW_CDB/NEW_PDB/undotbs1.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/undo_2.300.1099865729','+DATA/NEW_CDB/NEW_PDB/undo_2.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/DATAFILE/users.298.1099865729','+DATA/NEW_CDB/NEW_PDB/users.dbf','+DATA/NEW_CDB/DAA802F379F97B10E0530938A8C07301/TEMPFILE/temp.285.1099865737','+DATA/NEW_CDB/NEW_PDB/temp.dbf')FILE_NAME_CONVERT=NONE NOCOPY;
END
本文作者:张红久
本文来源:IT那活儿(上海新炬王翦团队)





