多租户容器数据库架构图总览
多租户容器数据库组成部分:
1.有且仅有一个CDB Root(CDB$ROOT),它包含了Root和所有PDB数据库的元数据和数据字典信息。
2.有且仅有一个Seed PDB(PDB$SEED),它的作用是创建其他PDB的模板,它是只读库,不能做任何修改。
3.0个或多个应用程序容器Application Container,每个Application Container包含一个Application Root,以及插在这个root上的Application PDBs,Application Root属于CDB Root。
4.0个或多个用户创建的PDB,每个PDB和12c之前的普通数据功能基本一样,在CDB创建之初,是没有PDB的,PDB根据用户业务需求后创建。
5.0个或1个Application Seed,它是应用程序容器里面用来创建Application PDBs的模板,是可选的,如果没有,则Application PDBs可以以第2条的PDB$SEED为模板创建。
创建PDB的几种方式总览
技术方式 | 描述 |
---|---|
Create a PDB from scratch | 通过pdb seed或者application seed作为模版创建 |
Clone an existing PDB or non-CDB | 通过源pdb或者源non-cdb克隆。 源数据库可以是本地/远程cdb里面的普通pdb 或者本地/远程cdb里application container里面的application pdb 或者是non-cdb |
Relocate a PDB to a different CDB | 从一个cdb里面搬迁pdb到另外一个cdb |
Plug an unplugged PDB into a CDB | 通过源pdb的元数据xml文件来把pdb插入现有cdb |
Reference a PDB as a proxy PDB | 通过本地/远程cdb里面的普通pdb 或者本地/远程cdb里application container里面的application pdb来创建一个代理pdb |
一、 通过种子PDB创建标准PDB(Create a PDB from scratch)
或者
需注意的几点:
1.注意当前是在cdb root还是application root,如果是cdb root,创建的就是标准pdb,如果在application root下,创建的是application pdb。
2.通过命令CREATE PLUGGABLE DATABASE创建,并指定本地pdb管理员账户,如果还需要其他子句可以添加,pdb刚创建完成后是mount模式,要打开到read write模式,默认会创建一个和pdb同名的服务,注意在网络配置文件中配置好以供客户端正常访问。
操作命令:
CREATE PLUGGABLE DATABASE salespdb
ADMIN USER salesadm
IDENTIFIED BY password
STORAGE (MAXSIZE 2G)
DEFAULT TABLESPACE sales
DATAFILE '/disk1/oracle/dbs/salespdb/sales01.dbf' SIZE 250M AUTOEXTEND ON
PATH_PREFIX = '/disk1/oracle/dbs/salespdb/'
FILE_NAME_CONVERT = ('/disk1/oracle/dbs/pdbseed/','/disk1/oracle/dbs/salespdb/');
需注意pdbseed的大小写。
二、通过本地PDB复制新的PDB
或者:
需满足的前提条件:
- 用户得在根容器数据库和源PDB数据库中有CREATE PLUGGABLE DATABASE的系统权限。
- 源PDB不能关闭。
- 如果CDB不是local undo 模式,源PDB得处于open read only模式。如果CDB是local undo,源PDB没有这个限制,如下查询是否是local undo 模式:
SYS@PRODCDB>SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';PROPERTY_NAME PROPERTY_VALUE -------------------- -------------------- LOCAL_UNDO_ENABLED TRUE
- 如果CDB不是归档模式,源PDB得处于open read only模式。如果CDB是归档模式,源PDB没有这个限制,如下查询是否是归档模式:
SYS@PRODCDB>archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
5.如果创建的是application pdb,需要和application container保持一样的字符集
操作命令:
以通过PDBPROD1复制一个PDBPROD3为例,因为实验库没开归档,需要源pdb read only,创建完后确保两个库都是打开状态
SYS@PRODCDB>show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED READ ONLY NO3 PDBPROD1 READ WRITE NOSYS@PRODCDB>alter pluggable database PDBPROD1 close;Pluggable database altered.SYS@PRODCDB>alter pluggable database PDBPROD1 open read only;Pluggable database altered.SYS@PRODCDB>create pluggable database PDBPROD3 FROM PDBPROD1 FILE_NAME_CONVERT=('PDBPROD1','PDBPROD3');Pluggable database created.SYS@PRODCDB>alter pluggable database PDBPROD1 close;Pluggable database altered.SYS@PRODCDB>show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED READ ONLY NO3 PDBPROD1 MOUNTED6 PDBPROD3 MOUNTEDSYS@PRODCDB>alter pluggable database all open;Pluggable database altered.SYS@PRODCDB>show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED READ ONLY NO3 PDBPROD1 READ WRITE NO6 PDBPROD3 READ WRITE NO
可根据业务情况选择是否加其他子句: PATH_PREFIX 、STORAGE、 NO DATA等。
三、通过远程PDB复制新的PDB
需满足的前提条件:
- 用户得在根容器数据库和源PDB数据库中有CREATE PLUGGABLE DATABASE的系统权限。
- 源数据库安装平台和目标数据库安装平台须具有同样的字节序endianness,源库安装选项必须和目标库安装选项相同或者是目标库的子集。
- 如果创建的是application pdb,源pdb的应用程序名称和版本须和目标application container的程序名称和版本保持一致。
- 如果目标CDB字符集不是AL32UTF8,则需要和源CDB兼容,且目标CDB所有application pdb需要和application container保持一样的字符集,如果CDB字符集是AL32UTF8,则没有要求。
- 源库不能关闭。
- 如果目标CDB不是local undo 模式,源PDB得处于open read only模式。
- 如果目标CDB不是归档模式,源PDB得处于open read only模式。
- 如果创建的是refreshable pdb,则源pdb得处于归档和local undo模式。
- 创建的database link连接用户须具有CREATE PLUGGABLE DATABASE和sysoper权限。
操作命令:
CREATE PLUGGABLE DATABASE pdb2 FROM pdb1@pdb1_link;
四、通过19c非容器数据库复制新的PDB
需满足的前提条件:
- 用户得在根容器数据库和源PDB数据库中有CREATE PLUGGABLE DATABASE的系统权限。
- 源数据库安装平台和目标数据库安装平台须具有同样的字节序endianness,源库安装选项必须和目标库安装选项相同或者是目标库的子集。
- 两边版本要在12.1.0.2及以上,且版本要一致。
- 新建的PDB数据块大小要和cdb保持一致。
- 如果non-cdb不是归档模式,要打开为read only。
- 字符集和dblink要求同上。
操作命令:
CREATE PLUGGABLE DATABASE pdb2 FROM mydb@mydb_link; --mydb是non-cdb的名字同CREATE PLUGGABLE DATABASE pdb2 FROM NON$CDB@mydb_link;--用NON$CDB代替。执行后在打开新建的pdb之前需要执行转换脚本 :ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
五、通过relocate迁移PDB
从一个CDB Root到另一个CDB Root
或从一个Application Root 到另一个Application Root
通过dblink复制源pdb的数据块,undo块,redo块到新的位置,是一种几乎没有downtime的数据库迁移方式,不需要更改网络连接串等,新库打开后,源库就会自动删除。
需满足的前提条件:
1.源库处于local undo模式。
2.目标CDB如果不是归档模式,需要处于read only状态。
3.用户,dblink,字符集的前提条件同上。
操作命令:
CREATE PLUGGABLE DATABASE ... FROM src_pdb_name@link2src... RELOCATE AVAILABILITY [MAX | NORMAL]
使用AVAILABILITY NORMAL(默认),源和目标共享同一个LISTENER。
六、通过XML元数据文件或者.pdb压缩归档文件导入非插入PDB
在CDB Root创建PDB
在application root创建pdb:
源库不能比新库版本更高,当用.pdb的归档文件创建时,不必指定源数据库的文件地址,当用XML的文件创建时,需指定SOURCE_FILE_NAME_CONVERT或 SOURCE_FILE_DIRECTORY
操作命令:
CREATE PLUGGABLE DATABASE salespdb USING '/disk1/usr/salespdb.xml' SOURCE_FILE_NAME_CONVERT = ('/disk1/oracle/sales/', '/disk2/oracle/sales/') NOCOPY STORAGE (MAXSIZE 2G) TEMPFILE REUSE;
用.pdb文件:
CREATE PLUGGABLE DATABASE salespdb USING '/disk1/usr/sales.pdb' STORAGE (MAXSIZE 2G);
七、代理PDB
在CDB Root创建代理PDB
在Application Container创建代理PDB
代理PDB实现的是像访问本地CDB中的PDB一样访问远程的PDB,只复制源PDB的 SYSTEM 和 SYSAUX 表空间。
需满足的前提条件:
1.用户得在根容器数据库和源PDB数据库中有CREATE PLUGGABLE DATABASE的系统权限。
2.本地CDB必须为归档模式和LOCAL UNDO模式。
3.创建Proxy PDB时,远程PDB必须为OPEN READ/WRITE 模式。
操作命令:
CREATE PLUGGABLE DATABASE pdb1 AS PROXY FROM pdb1@pdb1_link;