Oracle® Multitenant
Administrator’s Guide
Part I Multitenant Architecture
2 Overviewof the Multitenant Architecture
2.1Overview of Containers in a CDB
2.2 Overview of Commonality in the CDB
2.3 Overview of Applications in an Application Container
2.4Overview of Services in a CDB
2.5Overview of Tablespaces and Database Files in a CDB
2.6Overview of Availability in a CDB
2.7Overview of Oracle Resource Manager in a CDB
Part I 多租户体系结构概述
本章描述了多租户体系结构中最重要的组件。
2.3应用程序容器中的应用程序概述
在应用程序容器的上下文中,“application”一词是指“master application definition”。例如,应用程序可能包括tables,views,和packages的定义。
2.3.1关于应用容器
应用程序容器是一个可选的、用户创建的CDB组件,它存储一个或多个应用程序后端的数据和元数据。一个CDB包含0个或多个应用程序容器。
例如,您可以在一个应用程序容器中创建多个与销售相关的pdb,这些pdb共享一个由一组公共表和表定义组成的应用程序后端。您可以在一个单独的应用程序容器中存储多个与hr相关的pdb,并使用它们自己的公共表和表定义。
使用CREATE PLUGGABLE DATABASE AS语句AS APPLICATIONCONTAINER关键字
子句创建应用程序容器的应用程序根,从而隐式地创建应用程序容器本身。当您第一次创建应用程序容器时,它不包含任何PDBs。要创建应用程序PDBs,必须连接到应用程序根目录,然后执行create PLUGGABLE DATABASE语句。
在CREATE PLUGGABLE DATABASE语句中,必须指定容器名称(与应用程序根名称相同),例如,saas_sales_ac。应用程序容器的名称在CDB中必须是惟一的,并且在通过特定侦听器访问其实例的所有CDB的范围内也是惟一的。每个应用程序容器都有一个与应用程序容器同名的默认服务。
2.3.1.1应用容器的用途
在某些方面,应用程序容器充当CDB中的特定于应用程序的CDB。与CDB本身一样,一个应用程序容器可以包含多个pdb,并允许这些pdb共享元数据和数据。
应用程序root使应用程序PDBs能够共享一个应用程序,在此上下文中,这意味着一组命名的、版本化的公共元数据和数据。典型的应用程序安装应用程序公共用户、元数据链接的公用对象和数据链接的公共对象。
2.3.1.1.1应用程序容器的主要优点
与将每个应用程序存储在单独的PDB中相比,应用程序容器有几个优点。
•应用程序root存储所有应用程序pdb可以共享的元数据和数据。
例如,所有应用程序pdb都可以共享中央表中的数据,比如列出默认应用程序角色的表。此外,所有pdb都可以共享一个表定义,并将特定于pdb的行添加到其中。
•在应用程序root中维护主应用程序定义,而不是在每个PDB中维护单独的副本。
如果在应用程序root中升级应用程序,则更改将自动传播到所有应用程序pdb。应用程序后端可能包含数据链接的通用对象app_roles,这是一个表,其中列出了默认的角色:admin、manager、sales_rep,等等。连接到任何应用程序PDB的用户都可以查询这个表。
•应用程序容器可以包括应用程序seed、应用程序PDBs和代理PDBs(在其他CDBs中引用PDBs)。
•您可以从应用程序seed快速创建新的应用程序PDBs。
•您可以查询报告应用程序容器中所有pdb的视图。
•当连接到应用程序root时,可以使用CONTAINERS函数对多个pdb中的对象执行DML。
例如,如果产品表存在于每个应用程序PDB中,那么您可以连接到应用程序root,并使用一个SELECT语句查询所有应用程序PDB中的产品。
•您可以从应用程序root中拔出PDB,然后将其插入到高级Oracle数据库版本中的应用程序root中。因此,PDBs在Oracle数据库升级中非常有用。
2.3.1.1.2应用容器用例:SaaS
SaaS部署可以使用多个应用程序pdb,每个pdb用于共享元数据和数据的独立客户。
在纯SaaS环境中,主应用程序定义驻留在应用程序root中,而特定于客户的数据驻留在其自己的应用程序PDB中。例如,sales_app是应用程序root中的应用程序模型。名为cust1_pdb的应用程序只包含客户1的销售数据,而名为cust2_pdb的应用程序只包含客户2的销售数据。对于单个客户PDBs,可以进行插拔、解插、克隆和其他pdb级操作。
2.3.1.1.2纯SaaS配置具有以下优点:
•性能
•安全
•支持多个客户
每个客户的数据驻留在其自己的容器中,但经过了整合,因此可以对许多客户进行集体管理。该模型将管理多个应用程序的规模经济扩展到应用程序管理员,而不仅仅是DBA。
2.3.1.1.3 应用容器用例:逻辑数据仓库
客户可以使用多个应用程序PDBs来解决数据主权问题。
在一个示例用例中,一家公司将特定于每个财务季度的数据放在一个单独的PDB中。例如,名为sales_ac的应用程序容器包括q1_2016_pdb、q2_2016_pdb、q3_2016_pdb和q4_2016_pdb。您可以在PDB中定义对应于相关季度的每个事务。要生成聚合一年性能的报告,可以使用CONTAINERS()子句聚合四个pdb。
这种逻辑仓库设计的好处包括:
•针对单个PDB的数据的etl不影响其他PDB。
•执行计划更高效,因为它们基于实际的数据分布。
2.3.1.2 Application Root
应用程序容器只有一个Application Root,它是容器中应用程序PDBs的父级。
作为application root的属性是在创建时建立的,不能更改。application root所在的惟一容器是CDB root。application root在某些方面类似于CDB root,在某些方面类似于PDB:
•与CDB root一样,应用程序root充当插入到其中的PDBs的父容器。当连接到应用程序root时,您可以管理公共用户和特权,创建应用程序pdb,切换容器,并发出适用于应用程序容器中所有pdb的DDL。
•与PDB类似,创建应用程序root
用CREATE PLUGGABLE DATABASE语句创建,用alter PLUGGABLEDATABASE修改,用STARTUP和SHUTDOWN修改它的可用性。您可以使用DDL来插入、拔出和删除应用程序root。应用程序root具有自己的service name,用户可以使用与连接PDB相同的方式连接到应用程序root。
应用程序root与CDB root和标准PDB都不同,因为它可以存储用户创建的公共对象,这些对象称为应用程序公共对象。插入到应用程序root的应用程序PDBs可以访问应用程序公共对象。应用程序公共对象对于不属于应用程序root的CDB root、其他应用程序root或pdb是不可见的。
例2-7 创建应用程序root
在本例中,您作为管理公共用户c##系统登录到CDB ROOT。创建一个名为saas_sales_ac的应用程序容器,然后打开与容器同名的应用程序ROOT。
--创建名为saas_sales_ac的应用程序容器
CREATE PLUGGABLE DATABASE saas_sales_ac AS APPLICATION CONTAINER ADMINUSER saas_sales_ac_adm IDENTIFIEDBY manager;
--打开application root
ALTER PLUGGABLE DATABASE saas_sales_ac OPEN;
将当前容器设置为saas_sales_ac,然后验证此容器是否是应用程序ROOT:
--设置当前容器为saas_sales_ac
ALTERSESSIONSET CONTAINER = saas_sales_ac;
COL NAME FORMAT a15 COL ROOT FORMAT a4
SELECT CON_ID,NAME, APPLICATION_ROOT AS ROOT, APPLICATION_PDB AS PDB FROM V$CONTAINERS;
CON_IDNAME ROOT PDB
---------- --------------- ---- ---
3 SAAS_SALES_AC YES NO
2.3.1.3 Application PDBs
应用程序PDB是驻留在应用程序容器中的PDB。CDB中的每个PDB都驻留在零个或一个应用程序容器中。
例如,saas_sales_ac应用程序容器可能支持多个客户,每个客户应用程序将其数据存储在一个单独的PDB中。应用程序PDBs cust1_sales_pdb和cust2_sales_pdb可能驻留在saas_sales_ac中,在这种情况下,它们不属于其他应用程序容器(尽管作为PDBs,它们也必须属于CDB root)。
在连接到应用程序root时,通过执行Create PLUGGABLE DATABASE创建应用程序PDB。您可以从一个种子创建应用程序PDB,或者克隆一个PDB,或者插入一个未插入的PDB。就像将PDB插入到CDB root一样,您可以克隆、拔出或删除应用程序PDB。但是,应用程序PDB必须始终属于应用程序root。
2.3.1.4 Application Seed
Application Seed是一个可选的、用户创建的应用程序容器中的PDB。一个应用程序容器有0个或1个Application Seed。
Application Seed使您能够快速创建应用程序PDBs。它在应用程序容器中的作用与PDB$SEED在CDB本身中的作用相同。
Application Seed名总是application_container_name$seed,其中application_container_name是应用程序容器的名称。例如,使用CREATE PDB ... AS SEED语句在saas_sales_ac应用程序容器中创建saas_sales_ac$SEED。
2.3.2 应用程序公共对象
应用程序公共对象是在应用程序root中的应用程序中创建的公共对象。公共对象要么是数据链接的,要么是元数据链接的。
对于数据链接的公共对象,应用程序PDBs共享一组数据。例如,saas_sales_ac应用程序容器的应用程序名为saas_sales_app,版本为1.0,并包含一个数据链接的usa_zipcodes表。在本例中,行只存储在应用程序root表中一次,但是在所有应用程序pdb中都是可见的。
对于元数据链接的公共对象,应用程序PDBs只共享元数据,但包含不同的数据集。例如,元数据链接的产品表在每个应用程序PDB中具有相同的定义,但是行本身是特定于PDB的。名为cust1pdb的应用程序可能有一个包含图书的产品表,而名为cust2pdb的应用程序可能有一个包含汽车部件的产品表。
2.3.2.1 应用公共对象的创建
要创建公共对象,请连接到应用程序root,然后执行create语句,该语句指定共享属性。
您只能在应用程序安装、升级或修补程序时创建或更改应用程序公共对象。您可以通过以下方式指定共享:
•default_sharing初始化参数
该设置是在root中创建的受支持类型的所有数据库对象的默认共享属性。
•SHARING clause
您可以在CREATE语句本身中指定这个子句。当在SQL语句中包含共享子句时,它优先于DEFAULT_SHARING初始化参数中指定的值。可能的值是元数据、数据、扩展数据和NONE。
下表显示了应用程序公共对象的类型,以及数据和元数据存储的位置。
2.3.2.2元数据关联的应用公共对象
元数据链接是一个字典对象,它支持引用和授予应用程序容器中所有pdb共享的公共元数据的权限。
在SHARING子句或DEFAULT_SHARING初始化参数中指定元数据值,可以指定到对象元数据的链接,称为元数据链接的公共对象。对象的元数据只在应用程序根目录中存储一次。
表、视图和代码对象(如PL/SQL过程)可以共享元数据。在这个上下文中,“元数据”包括列定义、约束、触发器和代码。
例如,如果sales_mlt是一个元数据链接的公共表,那么所有应用程序PDBs都将通过一个元数据链接访问存储在应用程序根目录中的这个表的相同定义。sales_mlt中的行在每个应用程序PDB中是不同的,但是列定义是相同的。
通常,应用程序中的大多数对象都是元数据链接的。因此,您只需维护一个主应用程序定义。这种方法将应用程序的管理集中在多个应用程序PDBs中。
例2-8创建一个元数据链接的公共对象
在本例中,SYSTEM用户登录到saas_sales_ac应用程序容器。系统在1.0版本安装一个名为saas_sales_app的应用程序(参见“应用程序维护”)。该应用程序创建一个名为saas_sales_adm的公共用户帐户。模式包含一个名为sales_mlt的元数据链接公共表。
-- Begin the install of saas_sales_app
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGIN INSTALL '1.0';
-- Create the tablespace for the app
CREATETABLESPACE saas_sales_tbs DATAFILESIZE100M AUTOEXTENDONNEXT10M MAXSIZE200M;
-- Create the user account saas_sales_adm, which will ownthe app
CREATEUSER saas_sales_adm IDENTIFIEDBY****** CONTAINER=ALL;
-- Grant necessary privileges to this user account
GRANTCREATESESSION,DBATO saas_sales_adm;
-- Makes the tablespace that you just created the defaultfor saas_sales_adm
ALTERUSER saas_sales_adm DEFAULTTABLESPACE saas_sales_tbs;
-- Now connect as the application owner
CONNECTsaas_sales_adm/******@saas_sales_ac
-- Create a metadata-linked table
CREATETABLE saas_sales_adm.sales_mlt SHARING=METADATA
(YEAR NUMBER(4),
REGION VARCHAR2(10),
QUARTER VARCHAR2(4),
REVENUE NUMBER);
-- End the application installation
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app END INSTALL '1.0';
您可以使用ALTER PLUGGABLE DATABASEAPPLICATION ... SYNC语句同步应用程序PDBs以使用相同的主应用程序定义。
通过这种方式,每个应用程序PDB都有一个指向saas_sales_adm的元数据链接。
sales_mlt常见的表。在名为cust1_pdb的PDB中更新sales_mlt的中间层代码在cust1_pdb中将行添加到这个表中,而在cust2_pdb中更新sales_mlt的中间层代码在cust2_pdb中将行添加到这个表的副本中。只有存储在应用程序root中的表元数据是共享的。
2.3.2.3 Data-Linked的应用公共对象
Data-Linked对象是这样一种对象,它的元数据和数据驻留在应用程序root中,并且可以从该应用程序容器中的所有应用程序pdb进行访问。
在SHARING子句或DEFAULT_SHARING初始化参数中指定数据值,就指定了一个到公共对象(称为数据链接的公共对象)的链接。数据仓库中的维度表通常是数据链接公共表的良好候选。
数据链接是一个字典对象,其功能非常类似于同义词。例如,如果countries是一个应用程序公共表,那么所有应用程序PDBs都可以通过数据链接访问该表的相同副本。如果将一行添加到此表,则此行在所有应用程序PDBs中都是可见的。
数据链接必须由应用程序的公共用户拥有。链接从它所指向的对象继承对象类型。数据链接的描述存储在创建它的PDB的字典中。例如,如果一个应用程序容器包含10个应用程序PDB,并且每个PDB包含一个指向countries应用程序公共表的链接,那么所有10个PDB都包含该链接的字典定义。
-- Begin an upgrade of the application
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGINUPGRADE'1.0'to'2.0';
-- Connect as application owner to application root
CONNECT saas_sales_adm/manager@saas_sales_ac
-- Create data-linked table named countries_dlt
CREATETABLE countries_dlt SHARING=DATA(country_id NUMBER,
country_nameVARCHAR2(20));
-- Insert records into countries_dlt
INSERT INTO countries_dlt VALUES(1,'USA');
INSERT INTO countries_dlt VALUES(44,'UK');
INSERT INTO countries_dlt VALUES(86,'China');
INSERT INTO countries_dlt VALUES(91,'India');
-- End application upgrade
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app ENDUPGRADETO'2.0';
使用ALTER PLUGGABLE DATABASE APPLICATION ... SYNC语句将应用程序pdb与应用程序root同步(请参阅“ApplicationSynchronization”)。这样,每个同步应用程序PDB都有一个到saas_sales_adm.countries_dlt data linked表的数据链接。
2.3.2.4 扩展数据链接应用程序对象
扩展数据链接对象是数据链接对象和元数据链接对象的混合。
在扩展数据链接对象中,存储在应用程序root中的数据对所有应用程序PDB都是公用的,并且所有PDB都可以访问此数据。但是,每个应用程序PDB可以创建自己的特定于PDB的数据,同时在应用程序root共享公共数据。因此,pdb用它们自己的数据来补充公共数据。
例如,一个销售应用程序可能支持多个应用程序pdb。所有应用程序PDB都需要美国的邮政编码。在这种情况下,您可以在应用程序根目录中创建zipcodes_edt扩展数据链接表。应用程序root存储美国邮政编码,因此所有应用程序PDB都可以访问它们。但是,一个应用程序PDB需要美国和加拿大的邮政编码。此应用程序PDB可以将加拿大邮政编码存储在应用程序PDB中的扩展数据链接对象中,而不是存储在应用程序root中。
通过连接到应用程序root并在Create语句中指定SHARING=extended data关键字,创建扩展数据链接对象。
示例2-10 创建扩展数据对象
在此示例中,SYSTEM连接到saas_sales_ac应用程序容器,然后将名为saas_sales_app的应用程序(在“示例2-8”中创建)从版本2.0升级到3.0。此应用程序以公共用户saas_sales_adm的身份登录到容器,创建名为zipcodes_edt的扩展数据链接表,然后将行插入其中。
-- Begin an upgrade of the app
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGINUPGRADE'2.0'to'3.0';
-- Connect as app owner to app root
CONNECT saas_sales_adm/manager@saas_sales_ac
-- Create a common-data table named zipcodes_edt
CREATETABLE zipcodes_edt SHARING=EXTENDED DATA
(code VARCHAR2(5),
country_idNUMBER,
region VARCHAR2(10));
-- Load rows into zipcodes_edt
INSERT INTO zipcodes_edt VALUES('08820','1','East');
INSERT INTO zipcodes_edt VALUES('10005','1','East');
INSERT INTO zipcodes_edt VALUES('44332','1','North');
INSERT INTO zipcodes_edt VALUES('94065','1','West');
INSERT INTO zipcodes_edt VALUES('73301','1','South');COMMIT;
-- End app upgrade
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app ENDUPGRADETO'3.0';
使用ALTER PLUGGABLE DATABASE APPLICATION ... SYNC语句将应用程序pdb与应用程序同步(请参阅“ApplicationSynchronization”)。这样,每个同步应用程序PDB都有一个到saas_sales_adm.zipcodes_edt数据链接表的数据链接。连接到这些pdb的应用程序可以看到在应用程序升级期间插入zipcodes的邮政编码,但也可以将自己的邮政编码插入此表。
2.3.3 应用程序维护
在此上下文中,应用程序维护指的是安装、卸载、升级或修补应用程序。
应用程序必须有名称和版本号。这些属性的组合决定了您可以执行哪些维护操作。在所有维护操作中,执行以下步骤:
1.首先执行ALTER PLUGGABLE DATABASE ... APPLICATION,带有BEGIN INSTALL、BEGINUPGRADE或BEGIN PATCH子句的应用程序语句。
2.执行语句以更改应用程序。
3.通过执行ALTER PLUGGABLE DATABASE ... APPLICATION,带有END INSTALL、END UPGRADE或END PATCH子句的应用程序语句。
随着应用程序的发展,应用程序容器维护所有版本和修补程序更改。
2.3.3.1 关于应用程序维护
使用ALTER PLUGGABLE DATABASE APPLICATION语句执行应用程序安装、升级和修补操作。
应用程序维护的基本步骤如下:
1.登录到应用程序root。
2.使用ALTER PLUGGABLE DATABASE APPLICATION ... BEGINk开始操作应用程序root。
3.执行应用程序维护语句。
4.使用ALTER PLUGGABLE DATABASE APPLICATION ... END结束操作。
使用脚本、SQL语句或GUI工具执行维护。
2.3.3.2 应用程序安装
应用程序安装是主应用程序定义的初始创建。典型的安装是创建用户帐户、表和PL/SQL包。
要安装应用程序,请在ALTER PLUGGABLE DATABASE应用程序语句中指定以下内容:
•应用程序的名称
•应用程序版本号
例2-11安装应用程序
本例假设您已登录到名为saas_sales_ac as的应用程序容器。
该示例在1.0版本安装一个名为saas_sales_app的应用程序。
请注意,您使用字符串而不是数字来指定版本。
应用程序创建一个名为saas_sales_adm的应用程序通用用户,授予必要的特权,然后作为该用户连接到应用程序root。该用户创建一个名为sales_mlt的元数据链接表。
-- Begin the install of saas_sales_app
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGIN INSTALL '1.0';
-- Create the tablespace for the app
CREATE TABLESPACE saas_sales_tbs DATAFILESIZE100M AUTOEXTENDONNEXT10M MAXSIZE200M;
-- Create the user account saas_sales_adm, which will ownthe application
CREATE USER saas_sales_adm IDENTIFIEDBY manager CONTAINER=ALL;
-- Grant necessary privileges to this user account
GRANT CREATE SESSION,DBATO saas_sales_adm;
-- Make the tablespace that you just created the defaultfor saas_sales_adm
ALTERUSER saas_sales_adm DEFAULTTABLESPACE saas_sales_tbs;
-- Now connect as the application owner
CONNECT saas_sales_adm/manager@saas_sales_ac
-- Create a metadata-linked table
CREATETABLE saas_sales_adm.sales_mlt SHARING=METADATA
(YEAR NUMBER(4),
REGION VARCHAR2(10),
QUARTER VARCHAR2(4),
REVENUE NUMBER);
-- End the application installation
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app END INSTALL '1.0';
PDB同步是用户发起的应用程序PDB与应用程序根目录中的应用程序的更新。在将应用程序PDBs与saas_sales_app应用程序同步之后,每个应用程序PDB将包含一个名为products_mlt的空表。应用程序可以连接到应用程序PDB,然后将特定于PDB的行插入到这个表中。
2.3.3.3应用程序升级
应用程序升级是对已安装应用程序的重大更改。
通常,升级会更改应用程序的物理体系结构。例如,升级可能添加新的用户帐户、表和包,或者更改现有对象的定义。
要升级应用程序,必须在ALTER PLUGGABLE DATABASE应用程序语句中指定以下内容:
•应用程序的名称
•旧的应用程序版本号
•新的应用程序版本号
例2-12使用自动化技术升级应用程序
在本例中,您以管理员身份连接到应用程序root,然后将应用程序saas_sales_app从版本1.0升级到版本2.0。升级将创建一个名为es_dlt的数据链接表,然后向其中添加行。它还创建了一个名为zipcodes_edt的扩展数据链接表,然后向其中添加行。
-- Begin an upgrade of the app
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGINUPGRADE'1.0'to'2.0';
-- Connect as app owner to app root
CONNECT saas_sales_adm/manager@saas_sales_ac
-- Create data-linked table named countries_dlt
CREATETABLE countries_dlt SHARING=DATA
(country_id NUMBER,
country_nameVARCHAR2(20));
-- Insert records into countries_dlt
INSERT INTO countries_dlt VALUES(1,'USA');
INSERT INTO countries_dlt VALUES(44,'UK');
INSERT INTO countries_dlt VALUES(86,'China');
INSERT INTO countries_dlt VALUES(91,'India');
-- Create an extended data-linked table namedzipcodes_edt
CREATETABLE zipcodes_edt SHARING=EXTENDED DATA
(code VARCHAR2(5),
country_idNUMBER,
region VARCHAR2(10));
-- Load rows into zipcodes_edt
INSERT INTO zipcodes_edt VALUES('08820','1','East');
INSERT INTO zipcodes_edt VALUES('10005','1','East');
INSERT INTO zipcodes_edt VALUES('44332','1','North');
INSERT INTO zipcodes_edt VALUES('94065','1','West');
INSERT INTO zipcodes_edt VALUES('73301','1','South');
COMMIT;
-- End app upgrade
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app ENDUPGRADETO'2.0';
2.3.3.3.1应用程序升级的工作原理
在应用程序升级期间,应用程序仍然可用。为了使这种可用性成为可能,Oracle数据库克隆了应用程序root。
下图概述了应用程序升级过程。
升级过程如下:
1.在初始状态下,应用程序root具有特定版本的应用程序。
2.用户执行ALTER PLUGGABLEDATABASE APPLICATION BEGIN UPGRADE应用程序升级语句。升级过程中,数据库会自动执行以下操作:
•克隆application root
例如,如果saas_sales_app应用程序在应用程序root下的版本是1.0,那么克隆的版本也是1.0.
将应用程序PDBs指向应用程序root克隆
克隆处于只读模式。应用程序仍然对应用程序PDBs可用。
3. 用户执行ALTER PLUGGABLEDATABASE APPLICATION END UPGRADE语句。
在此阶段,应用程序PDBs仍然指向应用程序根克隆,而原来的应用程序根位于新版本。例如,如果saas_sales_app应用程序在应用程序根目录下的版本是1.0,那么升级可能会将它带到版本2.0。但是,应用程序的根克隆仍然是1.0版。
4. 可选地,用户通过使用SYNC子句发出ALTERPLUGGABLE DATABASE application语句,将应用程序PDBs与升级后的应用程序根目录进行同步。
例如,在同步之后,一些应用程序pdb被插入到2.0版本的应用程序根目录中。但是,应用程序根克隆仍然支持必须停留在1.0版本上的应用程序pdb,或者任何插入到1.0版本的应用程序根上的新应用程序pdb。
2.3.3.3.2不同版本的应用
不同的应用程序PDBs可能使用不同版本的应用程序。
例如,一个应用程序PDB可能有saas_sales_app的1.0版本。在同一个应用程序容器中,另一个应用程序PDB具有该应用程序的2.0版本。
用例是提供给不同客户的SaaS应用程序。如果每个客户都有自己的应用程序PDB,那么一些客户可能会等待更长的时间来升级应用程序。在这种情况下,一些应用程序PDBs可能使用应用程序的最新版本,而其他应用程序PDBs使用较旧的版本。
2.3.3.4应用补丁
应用程序补丁是对应用程序的一个小更改。
典型的应用程序补丁示例包括错误修复和安全补丁。在一个补丁中允许新的功能和包。
一般来说,破坏性的操作是不允许的。例如,一个补丁不能包含DROP语句,或ALTER TABLE语句,这些语句删除一个列或更改一个数据类型。
正如Oracle数据库补丁过程限制Oracle数据库补丁中允许的操作的种类一样,应用程序补丁过程也限制应用程序补丁中允许的操作。如果修复包含引发“应用程序补丁中不支持的操作”错误的操作,则执行应用程序升级。
注意:
当另一个应用程序补丁或升级正在进行时,您不能对该应用程序进行补丁。
要修补应用程序,请在ALTER PLUGGABLE DATABASE应用程序语句中指定应用程序名称和修补程序编号。还可以指定应用程序最小版本。
例2-13使用自动化技术修补应用程序
在本例中,SYSTEM录到应用程序root,然后将应用程序saas_sales_app打上1.0或更高版本的补丁。补丁101以saas_sales_adm的身份登录到应用程序容器,然后创建一个名为get_total_revenue的元数据链接PL/SQL函数。
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGIN PATCH 101MINIMUMVERSION'1.0';
-- Connect to the saas_sales_ac container assaas_sales_adm, who owns the application
CONNECT saas_sales_adm/*******@saas_sales_ac
-- Now install the get_total_revenue() function
CREATE FUNCTION get_total_revenue SHARING= METADATA(p_year INNUMBER)
RETURNSYS_REFCURSORAS
c1_cursor SYS_REFCURSOR;
BEGIN
OPEN c1_cursor FOR
SELECT a.year,sum(a.revenue)
FROM containers(sales_data) a
WHERE a.year = p_year
GROUPBY a.year;
RETURN c1_cursor;
END;
/
-- End the patch
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app END PATCH 101;
2.3.4现有应用程序的迁移
您可以将安装在PDB中的应用程序迁移到应用程序root或应用程序PDB。
迁移现有应用程序的典型原因包括:
•使用安装程序的应用程序
有些应用程序使用安装程序而不是脚本。在这种情况下,可以在新的应用程序root中运行安装程序,然后使用DBMS_PDB_ALTER_SHARING包将对象设置为适当的共享模式:元数据、数据或扩展数据。root自动将更改传播到应用程序PDBs。Oracle数据库创建了一个安装的语句日志,因此以前的应用程序版本的PDBs可以插入到应用程序root中。
•在每个PDB中分别定义的应用程序
有些应用程序在每个PDB中定义,但是不存在应用程序容器。在这种情况下,您可以更新安装脚本来设置适当的共享模式。您创建一个应用程序根,然后在这个根中创建主应用程序定义。您可以将现有的PDBs作为应用程序PDBs,方法是将它们插入到应用程序根目录中,然后运行一个SQL脚本,将完整的定义替换为对公共定义的引用。
例如,可以将安装在PDB中的应用程序迁移到Oracle数据库12c CDB中,并将其插入到Oracle数据库18c CDB中的应用程序容器中。
2.3.5 隐式创建应用程序
除了用户创建的应用程序之外,应用程序容器还可以包含隐式创建的应用程序。
当使用CONTAINER=ALL子句发出应用程序公共用户操作时,在应用程序root中隐式创建应用程序,而在此之前不使用ALTER PLUGGABLE DATABASE BEGIN语句。
应用程序公共用户操作包括使用CREATE user语句创建公共用户或使用ALTER user语句更改公共用户等操作。数据库自动命名一个隐式应用程序$guid,其中guid是应用程序root的全局惟一ID。隐式应用程序是在应用程序root首次打开时创建的。
2.3.6应用程序同步
在应用程序PDB中,同步是用户发起的应用程序到最新版本的更新,以及应用程序root中的补丁。
当应用程序在应用程序root中安装、升级、打补丁或卸载时,更改不会自动传播到应用程序PDBs。您必须手动同步这些PDBs。当连接到应用程序PDB时,您可以通过语句ALTER PLUGGABLE DATABASE APPLICATION ... SYNC.来同步一个或多个应用程序。
2.3.6.1 单一应用的同步
如果在同步之前指定一个应用程序名称,则数据库只同步指定的应用程序。
在应用程序PDB中执行的以下语句使apexapp与应用程序PDB同步:
ALTERPLUGGABLE DATABASE APPLICATION apexapp SYNC;
可以使用SYNC TO PATCH patchnum子句将应用程序同步到特定的补丁号。下面的语句将一个名为saas_sales_app的应用程序同步到应用程序PDB中的patch 100:
ALTERPLUGGABLE DATABASE APPLICATION saas_sales_app SYNC TO PATCH 100;
要将应用程序同步到特定的应用程序版本,请使用同步到版本。下面的语句将应用程序PDB中的一个名为saas_sales_app的应用程序同步到2.0版本:
ALTERPLUGGABLE DATABASE APPLICATION saas_sales_app SYNC TO '2.0';
2.3.6.2 多应用同步
您可以按名称列出多个应用程序或指定ALL关键字。
按名称指定的应用程序
如果在同步之前列出多个应用程序名称,则数据库将同步指定的应用程序。下面的例子同步了apexapp和ordsapp:
ALTERPLUGGABLE DATABASE APPLICATION apexapp, ordsapp SYNC;
在通过名称指定多个应用程序时,不支持同步补丁补丁和同步到版本子句。
由所有如果指定所有同步,则数据库将同步所有应用程序,包括隐式创建的应用程序。以下语句同步所有应用程序:
ALTERPLUGGABLE DATABASE APPLICATION ALL SYNC;
除了指定的应用程序子集外,您可以同步所有应用程序,如下面的语句所示:
ALTERPLUGGABLE DATABASE APPLICATION ALL EXCEPT apexapp, ordsapp SYNC;
使用ALL时,不支持将补丁补丁与版本子句同步。
同步过程中重播的顺序
当使用ALL或一组名称指定多个应用程序时,应用程序开始和结束块的重播顺序与捕获顺序相同。假设您按照以下顺序升级应用程序:
1.apexapp from 1.0 to 2.0
2.ordsapp from 1.0 to 2.0
3.apexapp from 2.0 to 3.0
语句ALTER PLUGGABLE DATABASE APPLICATION apexapp, ordsapp SYNC以相同的顺序重播语句。
如果apexapp和ordsapp中的对象相互依赖,那么重播的顺序对于功能的正确性是非常重要的。
执行ALTER PLUGGABLE DATABASE APPLICATION apexapp SYNC,
然后执行ALTER PLUGGABLE DATABASE APPLICATION ordsapp SYNC,会按如下顺序重播语句:
1.apexapp from 1.0 to 2.0
2.apexapp from 2.0 to 3.0
3.ordsapp from 1.0 to 2.0
2.3.7 Container Maps
Container Maps允许连接到应用程序root的会话发出SQL语句,这些语句根据SQL语句中使用的谓词的值被路由到适当的PDB。
映射表在元数据链接的公共表中指定一个列,并使用分区将不同的应用程序PDBs与不同的列值关联起来。通过这种方式,当数据没有在表级进行物理分区时,Container Maps支持PDB级的数据分区。
使用Container Maps的关键组件是:
•metadata-linked表
此表将使用Container Maps进行查询。例如,您可以创建一个名为es_mlt的元数据链接表,它在每个应用程序PDB中存储不同的数据。在amer_pdb中,es_mlt.cname列存储北美国家名;在euro_pdb中,es_mlt.cname列存储欧洲国家的名称;在asia_pdb中,es_mlt.cname列存储亚洲国家的名称。
•Map table
在应用程序root中,创建一个按列表、散列或范围分区的单列映射表。映射表允许使用Container Maps启用的分区策略查询元数据链接的表。映射对象表中分区的名称必须与应用程序容器中的应用程序PDBs的名称匹配。
例如,名为pdb_map_tbl的映射表可以在cname列上按列表进行分区。名为amer_pdb、euro_pdb和asia_pdb的分区对应于应用程序PDBs的名称。每个分区中的值是国家的名称,例如,分区amer_pdb值('US'、'MEXICO'、'CANADA')。
从Oracle数据库18c开始,对于要使用映射的CONTAINERS()查询,映射表中的分区列不需要匹配元数据链接表中的列。假设Container Mapspdb_map_tbl启用了表sh.sales,而cname是映射表的分区列。尽管sh.sales不包含cname列,但映射表将以下查询路由到适当的PDB: SELECT * FROM CONTAINERS(sh.sales),其中cname ='US' ORDER BY time_id。
•Containermap
Container Maps是指定映射表的数据库属性。要设置该属性,需要连接到应用程序根并执行ALTER PLUGGABLE DATABASE set CONTAINER_MAP=map_table语句,其中map_table是映射表的名称。
例2-14创建元数据链接的表、映射表和Container Maps:第1部分
在本例中,您作为应用程序管理员登录到应用程序root。假设一个应用程序容器有三个应用程序pdb: amer_pdb、euro_pdb和asia_pdb。每个应用程序PDB存储不同地区的国家名称。一个名为oe的元数据链接表。es_mlt有一个存储国家名的cname列。对于这种分区策略,您可以使用partition by list来创建一个名为salesadm的映射对象。为每个区域创建一个分区的pdb_map_tbl。国家名称决定地区。
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app BEGIN INSTALL '1.0';
-- Create the metadata-linked table.
CREATETABLE oe.countries_mlt SHARING=METADATA (
regionVARCHAR2(30),
cnameVARCHAR2(30));
-- Create the partitioned map table, which is listpartitioned on the
-- cname column. The names of the partitions are thenames of the
-- application PDBs.
CREATETABLE salesadm.pdb_map_tbl (cname VARCHAR2(30)NOTNULL)
PARTITIONBYLIST(cname)(
PARTITION amer_pdb VALUES('US','MEXICO','CANADA'),
PARTITION euro_pdb VALUES('UK','FRANCE','GERMANY'),
PARTITION asia_pdb VALUES('INDIA','CHINA','JAPAN'));
-- Set the CONTAINER_MAP database property to the mapobject.
ALTER PLUGGABLE DATABASESET CONTAINER_MAP='salesadm.pdb_map_tbl';
-- Enable the container map for the metadata-linked tableto be queried.
ALTERTABLE oe.countries_mlt ENABLE CONTAINER_MAP;
-- Ensure that the table to be queried is enabled for the
-- CONTAINERS clause.
ALTERTABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT;
-- End the application installation.
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app END INSTALL '1.0';
在前面的脚本中,ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT语句指定在应用程序root中发出的查询和DML语句在默认情况下必须对数据库对象使用CONTAINERS()子句。
例2-15同步应用程序和添加数据:第2部分
这个例子延续了前面的例子。连接到应用程序root时,依次将当前容器切换到每个PDB,同步saas_sales_app应用程序,然后将特定于PDB的数据添加到oe.countries_mlt表。
ALTER SESSION SET CONTAINER=amer_pdb;
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES('AMER','US');
INSERT INTO oe.countries_mlt VALUES('AMER','MEXICO');
INSERT INTO oe.countries_mlt VALUES('AMER','CANADA');
COMMIT;
ALTER SESSION SET CONTAINER=euro_pdb;
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES('EURO','UK');
INSERT INTO oe.countries_mlt VALUES('EURO','FRANCE');
INSERT INTO oe.countries_mlt VALUES('EURO','GERMANY');
COMMIT;
ALTER SESSION SET CONTAINER=asia_pdb;
ALTER PLUGGABLE DATABASE APPLICATIONsaas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES('ASIA','INDIA');
INSERT INTO oe.countries_mlt VALUES('ASIA','CHINA');
INSERT INTO oe.countries_mlt VALUES('ASIA','JAPAN');
COMMIT;
例2-16查询元数据链接表:第3部分
这个例子延续了前面的例子。连接到应用程序root,然后查询oe.countries_mlt多次,在WHERE子句中指定不同的国家。该查询从oe.countries_mlt.region返回正确的值。
ALTER SESSION SET CONTAINER=saas_sales_ac;
SELECT region FROM oe.countries_mlt WHERE cname ='MEXICO';
REGION
------
AMER
SELECT region FROM oe.countries_mlt WHERE cname='GERMANY';
REGION
------
EURO
SELECT region FROM oe.countries_mlt WHERE cname='JAPAN';
REGION
------
ASIA
更多数据库相关学习资料,可以查看我的ITPUB博客,网名chenoracle:
http://blog.itpub.net/29785807/