多租户架构(multitenant architecture)使得Oracle数据库可以作为一个包含0个、1个或者多个用户创建的可插拔式数据库(PDB)的多租户容器数据库(CDB)。PDB是一个模式、模式对象和非模式对象的便携式集合,以一个非CDB形式展现给Oracle Net客户端。Oracle Database 12c之前的数据库都是非CDB。
容器(container)可以是一个PDB或者root容器(也称为root)。Root容器是一个模式、模式对象和非模式对象的集合,所有的PDB都属于root。
每个CDB都包含以下容器:
用户可以在CDB和非CDB中使用相同的工具,例如:
大型企业可能使用成百上千个数据库。通常这些数据库运行在不同物理服务器的不同平台上。由于硬件技术的改进,尤其是CPU数量的增加,服务器能够处理更多的工作负载。数据库可能只使用了服务器硬件容量的一小部分。这种方式既浪费硬件,又浪费人力资源。
例如,100台服务器,每台服务器上安装了一个数据库,每个数据库仅仅使用了10%的硬件资源和管理员10%的时间。DBA团队必须单独管理每个数据库得SGA、数据库文件、账户、安全等等,同时系统管理员必须维护100台不同的计算机。
图17-1使用缩小的比例显示了该问题,图中包含11个数据库,每个数据库拥有自己的应用和服务器。一个首席DBA监督一个4位DBA的团队,每个DBA负责2到3个数据库。
图17-1 整合前的数据库环境
对于管理问题的典型解决方案是在每台服务器上安装多个数据库,但是问题在于多个数据库实例并不共享后台进程、系统和进程内存或者Oracle元数据。另一个方法时将数据逻辑分隔到不同的模式或者虚拟私有数据库中,而它的问题在于虚拟实体难于管理、保护和传输。
将数据从多个数据库整合到单个计算机上的单个数据库的过程被称为数据库整合(database consolidate)。从Oracle Database 12c开始,Oracle多租户选项能够在不需要改变已有模式或应用的前提下整合数据。
PDB/非CDB兼容性保证意味着对于使用Oracle Net连接的客户端,PDB与非CDB表现一致。使用非CDB的应用程序后台的安装方案同样可以适用PDB,并且产生的结果相同。同样,连接到PDB的客户端代码的行为与连接到非CDB的客户端代码的行为相同。
针对整个非CDB的操作能够以相同的方式用于整个CDB,例如,Oracle Data Guard和数据库备份与恢复。因此,非CDB的用户、管理员以及开发人员在数据库被整合后将会拥有相同的体验。
图17-2描述了图17-1中的数据库被整合到一个计算机后的结构。DBA团队人员从5个减少到3个,一个管理CDB的CDB管理员,以及2个分别管理PDB的PDB管理员。
图17-2 单个CDB
使用多租户结构进行数据库整合具有以下优势:
除了数据库整合之外,多租户体系结构还拥有其他优点。这些优点源于将PDB相关的数据和数据字典元数据存储在PDB内部,而不是统一存储在一个地方。这种方式使得PDB作为一个独立的单元更易于管理,即使只有一个PDB时亦是如此。
数据字典分离可以带来以下优势:
一个数据库在存在期间,只能是一个CDB或者一个非CDB,不能将非CDB转换为CDB,反之亦然。必须在创建时指定为CDB,然后在其中创建PDB。
SQL语句CREATE DATABASE ... ENABLE PLUGGABLE DATABASE可以创建一个新的CDB。如果没有指定ENABLE PLUGGABLE DATABASE从句,那么新建的数据库为非CDB,并且不能包含PDB。
Oracle数据库随着root(CDB$ROOT)自动创建一个种子PDB(PDB$SEED)。下图显示了一个新建的CDB:
示例17-1演示了一个简单的查询,用于判断当前连接的数据库是否为一个非CDB,或者CDB中的一个容器。
示例17-1 判断数据库是否为CDB
SQL> SELECT NAME, CDB, CON_ID FROM V$DATABASE;
NAME
CDB CON_ID
--------- --- ----------
CDB1
YES 0
SQL语句CREATE PLUGGABLE DATABSE可以创建一个PDB。创建的PDB自动包含一个完整的数据字典,其中包括元数据和到root中系统提供的对象的内部链接。只能在CDB中创建PDB,而不能另一个PDB中创建PDB。 下图描述了创建PDB的可选方式:
下图显示了一个包含6个PDB的CDB。hrpdb是一个新建的PDB。salespdb是一个已经存在的PDB,它从另一个CDB中拔出并插入到该CDB中。剩余的4个PDB,名称包含test前缀,从salespdb复制创建。
从种子PDB创建一个PDB
可以使用语句CREATE PLUGGABLE DATABASE从PDB$SEED(创建PDB的模板)复制文件创建一个PDB。下图说明了从种子创建PDB的过程:
以下SQL语句使用OMF从种子PDB创建一个名为hrpdb的PDB:
CREATE PLUGGABLE DATABASE hrpdb
ADMIN USER
dba1 IDENTIFIED BY password
通过克隆创建一个PDB
这种方法将源PDB相关的文件复制到一个新的位置并将这些文件与新建的PDB关联。可以克隆同一个CDB或者其他CDB中的PDB。如果克隆另一个CDB中的PDB,必须使用数据库链接指定远程的CDB。下图说明了从同一个CDB中的PDB克隆一个PDB的过程:
如果PDB的底层文件系统支持存储快照,可以指定SNAPSHOT COPY从句使用存储快照克隆PDB。这种情况下,Oracle数据库不会完全复制源数据文件,而是创建一个底层文件系统的存储级别快照,并使用它创建PDB克隆。快照复制使得克隆可以接近瞬时完成。
以下SQL语句从名为hrpdb的PDB克隆一个名为salespdb的PDB:
CREATE PLUGGABLE DATABASE salespdb FROM hrpdb
通过插拔创建一个PDB
PDB在拔出状态下是一个自包含的数据文件组和一个XML元数据文件。这种方法使用描述PDB和相关文件的XML元数据文件将它与CDB关联。下图说明了插入一个已拔出的PDB的过程:
以下SQL语句基于XML文件中的元数据插入一个名为financepdb的PDB,并指定了NOCOPY,因为不需要对文件进行重命名:
CREATE PLUGGABLE DATABASE salespdb USING
'/disk1/usr/financepdb.xml' NOCOPY
从一个非CDB创建一个PDB
可以使用以下方法从一个已有的非CDB创建一个PDB:
下图演示了在非CDB上运行DBMS_PDB.DESCRIBE函数,然后使用非CDB文件创建PDB的方法:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30608670/viewspace-1976814/ ,如需转载,请注明出处,否则将追究法律责任。