Oracle 19c多租户架构


前言

  Multitenant Architecture起始于Oracle 12c,发展到当前多租户容器数据库是Oracle Database 20c中唯一被支持的体系架构,多租户体系架构以多租户容器数据库(CDB)形式运行,一个CDB包含0个、1个或多个可插拔数据库(PDB),PDB间相互独立,但都受CDB管理。PDB是模式、模式对象和非模式对象的可移植集合,对于Oracle Net客户端来说,它们是非CDB,在Oracle 12c之前Oracle数据库都是Non-CDB架构的。


  本文基于Oracle 19c、Oracle 20c官方文档。

1. CDB容器

  容器是多租户架构内的数据或元数据的逻辑集合,下图表示CDB中可能的容器:

   如上图,每个CDB包含以下的容器:
  • 1个CDB root容器:CDB root是模式、模式对象和非模式对象的集合,属于所有PDBS,根容器存储Oracle提供的元数据和公用用户,PL/SQL包就是一个元数据示例,公用用户面向每个容器,可以在用户权限范围内连接和管理所有的容器,根容器名为CDB$ROOT。
  • 1个系统容器:包括根CDB和CDB中所有的PDBS,系统容器是CDB本身的逻辑容器。
  • 0或多个应用程序容器:一个应用程序容器由一个应用程序根容器和多个插入了该根容器的PDB组成,系统容器包含CDB根容器和CDB中的所有PDB,而应用程序容器仅包含插入到应用程序根容器中的PDB,应用程序根容器属于CDB根目录,不属于其他容器。
  • 0个或多个用户创建的PDB:PDB包含一组特定功能所需的数据和代码,例如,PDB可以支持特定的应用程序,例如人力资源或销售应用程序,创建CDB是不包括创建PDB的,可以根据业务需求添加PDB,PDB完全属于零个或一个应用程序容器。如果PDB属于应用程序容器,则它是应用程序PDB。例如,cust1_pdb和cust2_pdb应用程序PDB可能属于saas_sales_ac应用程序容器,在这种情况下,它们不属于任何其他应用程序容器。
  • 1个种子PDB:种子PDB是CDB用来创建新PDB的系统模板,种子PDB名为PDB$SEED,无法在PDB$SEED中添加或修改对象。

1.1 没有应用程序容器的CDB

  下面是一个包含5个容器的简单CDB:系统容器(整个CDB)、CDB根容器、PDB种子(PDB$SEED)和两个PDB,每个PDB都有自己的专用应用程序,由不同的PDB管理员管理每个PDB,公用用户管理整个CDB。在此示例中,公用用户SYS可以管理root和每个PDB,与非CDB一样,在物理层面上,CDB具有数据库实例和数据库文件。

1.2 具有应用程序容器的CDB

  在此变体中,CDB包含名为saas_sales_ac的应用程序容器,在应用程序容器中,名为cust1_pdb的应用程序PDB支持一个客户的应用程序,而名为cust2_pdb的应用程序PDB支持另一客户的应用程序。CDB还包含一个名为hrpdb的PDB,它支持HR应用程序,但不属于应用程序容器。

  在此示例中,多个DBA管理CDB环境:

  • CDB管理员管理CDB本身。
  • 应用程序容器管理员管理saas_sales_ac容器,包括应用程序安装和升级。
  • 应用程序PDB管理员管理saas_sales_ac容器中的两个PDB :cust1_pdb和cust2_pdb。
  • 由PDB管理员管理hrpdb。

1.3 CDB架构的优势

  非CDB架构的缺点:大型企业可能使用数百或数千个数据库,这些数据库通常在多个物理服务器上的不同平台上运行,由于硬件技术的改进,尤其是CPU数量的增加,服务器可以处理比以前更大的工作量,数据库可能仅使用服务器硬件容量的一小部分,这种方法浪费了硬件和人力资源。

  例如,100个服务器可能每个都有一个数据库,每个数据库使用10%的硬件资源和10%的管理员时间,DBA团队必须分别管理每个数据库的SGA,数据库文件,帐户,安全性等,而系统管理员必须维护100台不同的计算机。下图描绘了11个数据库,每个数据库都有自己的应用程序和服务器,首席DBA负责监督由四个DBA组成的团队,每个团队负责两个或三个数据库。

1.3.1 多租户体系架构对数据库整合的好处

  数据库合并是将多个数据库的数据合并到一台计算机上的一个数据库中的过程,Oracle CDB架构能够合并数据和代码而无需更改现有模式或应用程序,在PDB/Non-CDB对应用程序来说是完全透明的,包括连接方式,另外使用Oracle Data Guard以及数据库备份和恢复时,对整个Non-CDB和CDB的操作、作用相同。因此,在合并数据库之后,Non-CDB的用户,管理员和开发人员的工作方式是相同的,如下DBA团队从5个减少到3个,其中1名CDB管理员管理CDB,而2名PDB管理员则对PDB进行管理。

  使用CDB架构进行数据库合并具有以下好处:

  • 降低成本:通过将硬件和数据库基础结构整合到同一组后台进程,并有效地共享计算和内存资源,可以降低硬件和维护成本,比如一台服务器上的100个PDB共享一个数据库实例。

  • 更轻松,更快速地迁移数据和代码:可以快速将PDB插入CDB,先从CDB拔下PDB,然后再将此PDB插入其他CDB;还可以在PDB仍然可用时对其进行复制,CDB字符集与其中的PDB的字符集无关,且不同数据库字符集的PDB可以存在于同一CDB中,比如某CDB的字符集是AL32UTF8,可以在该CDB中插入其他任何字符集的PDB,且可以在不进行字符集转换的情况下访问它。

  • 简化物理数据库的管理和监控:CDB管理员可以通过执行某个操作,如修补或执行RMAN备份,可以对CDB和其中的PDB进行统一管理,这简化了备份策略和灾难恢复。

  • 数据和代码分离:数据库合并到一个物理数据库中,PDB和Non-CDB的管理相似;例如,如果用户误删了关键数据,则PDB管理员可以使用Oracle Flashback或时间点恢复来检索丢失的数据,而不会影响其他PDB。

  • 确保行政职责分离:公用用户可以连接到在其上具有足够的权限的任何容器,而一个本地用户只能连接指定的PDB,管理员可以按以下方式划分职责:管理员使用公用帐户来管理CDB或应用程序容器,因为权限包含在授予权限的容器中,所以一个PDB上的本地用户对同一CDB中其他PDB则没有访问权限,管理员使用本地帐户来管理单个PDB。

  • 轻松调整性能:收集单个数据库的性能指标要比收集多个数据库容易,一个SGA的大小比100个SGA的大小容易。

  • 更少的数据库补丁和升级:将补丁程序应用于一个数据库要比对100个数据库容易,并且对一个数据库进行升级要比对100个数据库进行升级容易。

1.3.2 多租户体系结构对可管理性的好处

  CDB架构的优势不仅仅在于数据库整合,PDB自身也存储PDB的数据和元数据,而不是将所有PDB字典元数据存储在同一个数据库中。通过存储自己的字典元数据,PDB可以作为一个独立的单元进行管理。即使只有一个PDB在CDB中,也会产生这种好处;将PDB分组到单独管理的应用程序容器中,可以进一步提高可管理性。

  在CDB中,数据字典元数据在根容器和PDB之间拆分,分离数据字典的好处包括:

  • 轻松升级数据和代码:例如,无需将CDB从一个数据库版本升级到另一个数据库版本,而是可以从现有CDB中快速拔出PDB,然后将其从更高版本中插入到新创建的CDB中。

  • 服务器之间的迁移更容易:要执行负载平衡或满足SLA,可以将应用程序数据库从本地数据中心迁移到云中,或在同一环境中的两台服务器之间迁移。

  • 防止PDB中的数据损坏:可以将PDB闪回到SCN或PDB特定的还原点,而不会影响其他PDB。此功能类似于Non-CDB的闪回数据库功能。

  • 能够在单个位置安装,管理和升级特定于应用程序的数据和元数据:可以将一组特定于应用程序的PDB定义为单个组件,称为应用程序容器。然后,可以在此容器中定义一个或多个应用程序,每个应用程序都是该应用程序容器中共享的一组命名的版本化通用元数据和数据。

  例如,SaaS供应商的每个客户都可以拥有自己的应用程序PDB,每个应用程序PDB可能具有定义相同的名为的表sales_mlt,每个PDB中的数据不同。PDB可以共享一个名为的数据链接公共对象countries_olt,该对象在每个PDB中具有相同的数据。作为应用程序管理员,可以管理主应用程序定义,以便每个新客户都能获得具有相同对象的PDB,并对现有模式进行的所有更改(例如,添加新表或更改定义表)适用于共享应用程序定义的所有PDB。

  • 与Oracle数据库资源管理器集成:在CDB环境中,一个问题是在同一服务器上运行的PDB之间争用系统资源,另一个问题是限制资源使用,以获得更一致、可预测的性能。要解决此类资源争用,使用和监控问题,请使用Oracle数据库资源管理器。

2. PDB

2.1 PDB概述

  PDB集schemas、schema对象和nonschema对象于一体,形似应用程序,以独立的数据库模式运行。从物理层面上面来说,每个PDB都有其自己的数据文件集,用于存储PDB的数据。CDB包含它所有PDB的所有数据文件,以及CDB本身的一系列元数据系统数据文件。要移动或存档PDB,可以将其拔出,拔出的PDB由PDB数据文件和元数据文件组成,除非插入CDB,否则无法使用未插入的PDB。

  如下展示名为MYCDB的CDB:

  从物理层面来说,MYCDB是一个Oracle数据库,即与实例相关联的一组数据文件。尽管在Oracle Real Application Clusters中可以有多个实例,这里MYCDB具有一个数据库实例,以及一组数据库文件。

  MYCDB包含两个PDB:hrpdb和salespdb,这些PDBS对各自的应用以独立的数据库运行,对应用程序来说连接的是CDB还是PDB是感知不到的。可以连接到CDB root来管理CDB本身或其中的任何PDB,root是所有PDB和应用程序容器所属的架构,架构对象和非架构对象的集合。

2.2 创建PDB

  CDB支持多种创建PDB的技术,创建PDB自动包含完整的数据字典,其中包括元数据和CDB root中指向系统提供的对象的内部链接,必须从单个根目录定义每个PDB:CDB根目录或应用程序根目录。

  每个PDB都有一个全局唯一标识符(GUID),PDB GUID主要用于生成存储PDB文件的目录名称,包括Oracle Managed Files目录和非Oracle Managed Files目录。

  创建PDB有多种技术(如下图),所有这些技术都需要使用CREATE PLUGGABLE DATABASE语句,使用CREATE PLUGGABLE DATABASE语句可以创建PDB、应用程序容器、应用程序种子和应用程序PDB。

  创建PDB的一般前提条件:

  • CDB必须存在且处于读写模式;

  • 当前用户必须是基于当前容器CDB root或应用程序容器的公用用户,当前用户必须具有CREATE PLUGGABLE DATABASE系统特权;

  • PDB名称在单个CDB中必须是唯一的,PDB名称遵循与服务名称相同的规则(不区分大小写);

  • 如果要在具有物理备用数据库的Oracle Data Guard配置中创建PDB,如果创建的PDB包含使用透明数据加密的数据等情况,必须在创建PDB之前完成的额外配置;

  • 如果要通过克隆Non-CDB来创建PDB,并且希望通过源Non-CDB的备份来恢复新的PDB,则必须在克隆前执行DBMS_PDB.EXPORTRMANBACKUP,当以读写模式打开源数据库时,请在克隆前的最后一步执行该存储过程,此过程将捕获数据字典中的所有备份元数据;将PDB重定位到其他CDB时,无需执行DBMS_PDB.EXPORTRMANBACKUP,拔出PDB会自动导出备份元数据。

  示例,创建了一个新的名为cypdb的PDB,并创建对应的本地管理员cyadm,并且预定义DBA角色,并指定默认表空间(PDB的所有表空间不得超过10GB):

SYS@primpdb 15:06:43> CREATE PLUGGABLE DATABASE cypdb ADMIN USER cyadm IDENTIFIED BY Cyadm123 ROLES=(DBA) 
 STORAGE (MAXSIZE 10G) DEFAULT TABLESPACE tbscy DATAFILE '/home/app/oracle/oradata/cypdb/cypdb01.dbf' 
 SIZE 1024M AUTOEXTEND ON;

未完待续……

猜你喜欢

转载自blog.csdn.net/u010257584/article/details/108461167