当前位置: 代码迷 >> 综合 >> Oracle Multitenant : Application Containers in Oracle Database 19c
  详细解决方案

Oracle Multitenant : Application Containers in Oracle Database 19c

热度:77   发布时间:2024-01-12 23:31:16.0

应用程序容器是Oracle Database 12c第2版(12.2)中的一项新功能,允许您定义应用程序根目录,如迷你CDB根容器,以及相关的应用程序容器PDB。应用程序根可以容纳一个或多个应用程序,每个应用程序由与应用程序根关联的可插拔数据库使用的共享配置,元数据和对象组成。

本文中的示例使用Oracle托管文件(OMF),因此不需要进行文件名转换。虽然目前尚未记录,但OMF对于应用程序容器同步是必需的。如果您需要,某些部分可以使用适当的FILE_NAME_CONVERTPDB_FILE_NAME_CONVERT设置,但其他部分将失败。

从12.2开始,我们可以在单个CDB中拥有代理PDB,应用程序根容器和单个用户定义的PDB(常规或应用程序PDB),而无需支付多租户选项。请注意,我们仍然只限于一个用户定义的PDB。

配置OMF

set line 188show parameter db_create_file_dest; ALTER SYSTEM SET db_create_file_dest = '+data' scope=spfile;

管理应用程序根域

创建新的应用程序容器与创建常规PDB类似,但需要包含该AS APPLICATION CONTAINER子句。

--- 创建一个应用PDBCREATE PLUGGABLE DATABASE sales_app AS APPLICATION CONTAINER ADMIN USER app_admin IDENTIFIED BY manager;ALTER PLUGGABLE DATABASE sales_app OPEN;

通过克隆现有PDB来创建应用程序容器。

应用程序容器关闭后,只要没有关联的PDB,就可以删除它。

ALTER PLUGGABLE DATABASE sales_app CLOSE;DROP PLUGGABLE DATABASE sales_app INCLUDING DATAFILES;

应用程序容器的基本管理类似于常规PDB,包括克隆,拔出插件等。如果应用程序容器没有关联的PDB,则只能将其拔出。

管理应用程序PDB

要创建应用程序PDB,必须连接到应用程序根目录,而不是CDB根目录。在这种情况下,应用程序根容器位于本地实例中,但如果我们将本地代理PDB定义为指向它,则它可能位于远程实例中。

ALTER SESSION SET container = sales_app;

一旦连接到应用程序根目录,我们就可以正常创建可插拔数据库,这次它只是一个应用程序PDB。

CREATE PLUGGABLE DATABASE sales_app_pdb ADMIN USER pdb_admin IDENTIFIED BY manager;ALTER PLUGGABLE DATABASE sales_app_pdb OPEN;

一旦我们创建了新的应用程序PDB,我们就应该将它与应用程序根目录中定义的所有应用程序同步。

ALTER SESSION SET container = sales_app_pdb;ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;

我们可以删除现有的应用程序PDB。可以从应用程序根目录或常规根容器中完成该操作。

ALTER SESSION SET container = sales_app;ALTER PLUGGABLE DATABASE sales_app_pdb CLOSE;DROP PLUGGABLE DATABASE sales_app_pdb INCLUDING DATAFILES;

管理应用程序

应用程序APPLICATION根据ALTER PLUGGABLE DATABASE命令的子句在应用程序根容器中进行管理,如下所述。

ALTER PLUGGABLE DATABASE APPLICATION
{ { app_name{ BEGIN INSTALL 'app_version' [ COMMENT 'comment' ]| END INSTALL [ 'app_version' ]| BEGIN PATCH number [ MINIMUM VERSION 'app_version' ] [ COMMENT 'comment' ]| END PATCH [ number ]| BEGIN UPGRADE 'start_app_version' TO 'end_app_version' [ COMMENT 'comment' ]| END UPGRADE [ TO 'end_app_version' ]| BEGIN UNINSTALL| END UNINSTALL| SET PATCH number| SET VERSION 'app_version'| SET COMPATIBILITY VERSION { 'app_version' | CURRENT }| SYNC  }|{ ALL SYNC }
}

 

安装应用程序

在这里,我们将逐步完成在应用程序根容器中创建简单应用程序的过程。

连接到应用程序根容器。

ALTER SESSION SET container = sales_app;

我们启动新应用程序,为其提供一个字符串来标识应用程序的版本。

ALTER PLUGGABLE DATABASE APPLICATION ref_app BEGIN INSTALL'1.0';

现在我们构建应用程序组件,创建单个表。

CREATE TABLESPACE ref_app_ts DATAFILE SIZE 1M AUTOEXTEND ON NEXT 1M;CREATE USER ref_app_user IDENTIFIED BY ref_app_user DEFAULT TABLESPACE ref_app_ts QUOTA UNLIMITED ON ref_app_ts CONTAINER=ALL;GRANT CREATE SESSION, CREATE TABLE TO ref_app_user;CREATE TABLE ref_app_user.reference_data SHARING=DATA (id NUMBER,description VARCHAR2(50),CONSTRAINT t1_pk PRIMARY KEY (id));INSERT INTO ref_app_user.reference_data SELECT level,'Description of ' || level FROM   dual CONNECT by level <= 5;COMMIT;

应用程序组件完成后,我们必须结束安装过程。

ALTER PLUGGABLE DATABASE APPLICATION ref_app END INSTALL;

该应用程序在DBA_APPLICATIONS视图中查询。

COLUMN app_name FORMAT A20
COLUMN app_version FORMAT A10SELECT app_name, app_version, app_status FROM dba_applications WHERE app_name = 'REF_APP';APP_NAME             APP_VERSIO APP_STATUS
-------------------- ---------- ------------
REF_APP              1.0        NORMAL

此时,我们需要同步与应用程序根容器关联的应用程序PDB,以便他们可以看到新的应用程序。以下命令连接到应用程序容器,检查应用程序对象是否存在,同步应用程序并再次检查对象是否存在。

-- Connect to application container.CONN / AS SYSDBAALTER SESSION SET container = sales_app_pdb;SHOW CON_NAMECON_NAME
------------------------------
SALES_APP_PDB
SQL>-- Check for presence of application objects.DESC ref_app_user.reference_data;
ERROR:
ORA-04043: object ref_app_user.reference_data does not existSQL>-- Sync the application with the application root.ALTER PLUGGABLE DATABASE APPLICATION ref_app SYNC;--ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;-- Check for presence of application objects.DESC ref_app_user.reference_data;Name                                      Null?    Type----------------------------------------- -------- ----------------------------ID                                        NOT NULL NUMBERDESCRIPTION                                        VARCHAR2(50)SQL>

我们可以看到同步操作使应用程序在应用程序容器中可用。

现在,应用程序已根据应用程序PDB进行注册,因此它将在DBA_APP_PDB_STATUS视图中列出。

CONN / AS SYSDBA
ALTER SESSION SET container = sales_app;COLUMN name FORMAT A20
COLUMN app_name FORMAT A20
COLUMN app_version FORMAT A10SELECT c.name,aps.con_uid,aps.app_name,aps.app_version,aps.app_status
FROM   dba_app_pdb_status apsJOIN v$containers c ON c.con_uid = aps.con_uid
WHERE  aps.app_name = 'REF_APP';NAME                    CON_UID APP_NAME             APP_VERSIO APP_STATUS
-------------------- ---------- -------------------- ---------- ------------
SALES_APP_PDB        4291055883 REF_APP              1.0        NORMALSQL>

升级应用程序

在本节中,我们将演示对我们在上一节中创建的应用程序的简单升级。

连接到应用程序根容器。

ALTER SESSION SET container = sales_app;

启动我们之前创建的应用程序的升级,提供新版本字符串以标识更改。

ALTER PLUGGABLE DATABASE APPLICATION ref_app BEGIN UPGRADE'1.0'to'1.1';

对应用程序进行必要的更改。在这种情况下,我们将向表中添加一个新列,并创建一个函数以从表中返回数据。

ALTER TABLE ref_app_user.reference_data ADD (created_date DATE DEFAULT SYSDATE);CREATE OR REPLACE FUNCTION ref_app_user.get_ref_desc (p_id IN reference_data.id%TYPE)RETURN reference_data.description%TYPE
ASl_desc reference_data.description%TYPE;
BEGINSELECT descriptionINTO   l_descFROM   reference_dataWHERE  id = p_id;RETURN l_desc;
EXCEPTIONWHEN NO_DATA_FOUND THENRETURN NULL;
END;
/GRANT EXECUTE ON ref_app_user.get_ref_desc TO PUBLIC;

完成更改后,我们必须结束升级过程。

ALTER PLUGGABLE DATABASE APPLICATION ref_app END UPGRADE;

和以前一样,我们需要连接到依赖的应用程序容器并同步它,因此更改是可见的。

-- Connect to application container.CONN / AS SYSDBA
ALTER SESSION SET container = sales_app_pdb;SHOW CON_NAMECON_NAME
------------------------------
SALES_APP_PDB
SQL>-- Check for presence of application objects.DESC ref_app_user.reference_data;Name                                      Null?    Type----------------------------------------- -------- ----------------------------ID                                        NOT NULL NUMBERDESCRIPTION                                        VARCHAR2(50)SQL>SELECT ref_app_user.get_ref_desc(1) FROM dual;SELECT ref_app_user.get_ref_desc(1) FROM dual*
ERROR at line 1:
ORA-00904: "REF_APP_USER"."GET_REF_DESC": invalid identifierSQL>-- Sync the application with the application root.ALTER PLUGGABLE DATABASE APPLICATION ref_app SYNC;--ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;-- Check for presence of application objects.DESC ref_app_user.reference_data;Name                                      Null?    Type----------------------------------------- -------- ----------------------------ID                                        NOT NULL NUMBERDESCRIPTION                                        VARCHAR2(50)CREATED_DATE                                       DATESQL>SELECT ref_app_user.get_ref_desc(1) FROM dual;REF_APP_USER.GET_REF_DESC(1)
--------------------------------------------------------------------------------
Description of 1SQL>

我们可以看到对表的修改,并且在同步操作之后新功能变得可见。

现在,该DBA_APP_PDB_STATUS视图中列出了该应用程序的新版本。

CONN / AS SYSDBA
ALTER SESSION SET container = sales_app;COLUMN name FORMAT A20
COLUMN app_name FORMAT A20
COLUMN app_version FORMAT A10SELECT c.name,aps.con_uid,aps.app_name,aps.app_version,aps.app_status
FROM   dba_app_pdb_status apsJOIN v$containers c ON c.con_uid = aps.con_uid
WHERE  aps.app_name = 'REF_APP';NAME                    CON_UID APP_NAME             APP_VERSIO APP_STATUS
-------------------- ---------- -------------------- ---------- ------------
SALES_APP_PDB        4291055883 REF_APP              1.1        NORMALSQL>

卸载应用程序

在本节中,我们将卸载我们之前创建的应用程序。

连接到应用程序根容器。

ALTER SESSION SET container = sales_app;

启动应用程序的卸载。

ALTER PLUGGABLE DATABASE APPLICATION ref_app BEGIN UNINSTALL;

执行删除应用程序所需的任何操作。

DROP USER ref_app_user CASCADE;DROP TABLESPACE ref_app_ts INCLUDING CONTENTS AND DATAFILES;

删除应用程序组件后,我们可以结束卸载过程。

ALTER PLUGGABLE DATABASE APPLICATION ref_app END UNINSTALL;

我们现在同步与应用程序根容器关联的应用程序conatiner,以便删除该应用程序。

-- Connect to application container.CONN / AS SYSDBA
ALTER SESSION SET container = sales_app_pdb;SHOW CON_NAMECON_NAME
------------------------------
SALES_APP_PDB
SQL>-- Check for presence of application objects.DESC ref_app_user.reference_data;Name                                      Null?    Type----------------------------------------- -------- ----------------------------ID                                        NOT NULL NUMBERDESCRIPTION                                        VARCHAR2(50)CREATED_DATE                                       DATESQL>SELECT ref_app_user.get_ref_desc(1) FROM dual;REF_APP_USER.GET_REF_DESC(1)
--------------------------------------------------------------------------------
Description of 1SQL>-- Sync the application with the application root.ALTER PLUGGABLE DATABASE APPLICATION ref_app SYNC;--ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;-- Check for presence of application objects.DESC ref_app_user.reference_data;
ERROR:
ORA-04043: object ref_app_user.reference_data does not existSQL>SELECT ref_app_user.get_ref_desc(1) FROM dual;
SELECT ref_app_user.get_ref_desc(1) FROM dual*
ERROR at line 1:
ORA-00904: "REF_APP_USER"."GET_REF_DESC": invalid identifierSQL>

我们可以看到同步操作从应用程序容器中删除了应用程序。

现在,应用程序已标记为已卸载应用程序PDB。

CONN / AS SYSDBA
ALTER SESSION SET container = sales_app;COLUMN name FORMAT A20
COLUMN app_name FORMAT A20
COLUMN app_version FORMAT A10SELECT c.name,aps.con_uid,aps.app_name,aps.app_version,aps.app_status
FROM   dba_app_pdb_status apsJOIN v$containers c ON c.con_uid = aps.con_uid
WHERE  aps.app_name = 'REF_APP';NAME                    CON_UID APP_NAME             APP_VERSIO APP_STATUS
-------------------- ---------- -------------------- ---------- ------------
SALES_APP_PDB        4291055883 REF_APP              1.1        UNINSTALLEDSQL>

应用通用对象

在应用程序中创建的对象称为应用程序公共对象,可以采用三种形式之一。

  • 元数据链接(METADATA):应用程序根保存所有链接的PDB将使用元数据链接引用的元数据信息。这可用于集中应用程序对象的定义,但所有数据都将保存在本地,而不是集中保存。
  • Data-Linked(DATA):应用程序根目录包含对象的元数据和数据。所有链接的PDB都将引用集中式元数据和数据。数据链接类似于同义词,但在容器之间。
  • Extended Data-Linked(EXTENDED DATA):应用程序根用于保存对象的元数据和数据。所有链接的PDB都将引用集中式元数据和数据。除了中央共享数据之外,本地应用程序PDB还可以插入其自己的数据,其他PDB无法看到。

DEFAULT_SHARING参数具有METADATA默认值,用于确定所使用的默认共享类型。

SHOW PARAMETER default_sharingNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
default_sharing                      string      METADATA
SQL>

这可以重置,或者可以在对象级别更改共享类型,如下所示。

以下示例用于SHARING=METADATA创建元数据链接对象。

CREATE TABLE ref_app_user.reference_data SHARING=METADATA (id NUMBER,description VARCHAR2(50),CONSTRAINT t1_pk PRIMARY KEY (id));

以下示例用于SHARING=DATA创建和填充数据链接对象。

CREATE TABLE ref_app_user.reference_data SHARING=DATA (id NUMBER,description VARCHAR2(50),CONSTRAINT t1_pk PRIMARY KEY (id));INSERT INTO ref_app_user.reference_data SELECT level,'Description of ' || level FROM  dual CONNECT by level <= 5;COMMIT;

任何从应用程序PDB插入此表的尝试都将导致错误。

INSERT INTO ref_app_user.reference_data VALUES (6, 'Description for 6');
INSERT INTO ref_app_user.reference_data VALUES (6, 'Description for 6')*
ERROR at line 1:
ORA-65097: DML into a data link table is outside an application actionSQL>

以下示例用于SHARING=EXTENDED DATA创建和填充扩展的数据链接对象。

CREATE TABLE ref_app_user.reference_data SHARING=EXTENDED DATA (id NUMBER,description VARCHAR2(50),CONSTRAINT t1_pk PRIMARY KEY (id));INSERT INTO ref_app_user.reference_data SELECT level,'Description of ' || level FROM dual CONNECT by level <= 5;COMMIT;

此对象将允许从应用程序PDB插入数据,但其他PDB将无法看到此本地数据。

INSERT INTO ref_app_user.reference_data VALUES (6, 'Description for 6');

管理应用程序种子

应用程序根容器可以选择具有应用程序种子数据库,允许您使用预配置的种子来创建新的应用程序容器。可以从CDB种子,现有应用程序容器或应用程序根容器创建应用程序种子。在这个例子中,我们将从CDB种子创建一个新的应用程序种子。

连接到应用程序根容器。

ALTER SESSION SET container = sales_app;

使用该AS SEED子句从CDB种子创建应用程序种子。种子将以应用程序根容器命名,并添加“$ SEED”后缀。

-- Create the application seed.CREATE PLUGGABLE DATABASE AS SEED ADMIN USER pdb_admin IDENTIFIED BY manager;ALTER PLUGGABLE DATABASE sales_app$SEED OPEN;-- Sync it will all the applications.ALTER SESSION SET CONTAINER=sales_app$SEED;ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;-- Switch it to read-only.ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;ALTER PLUGGABLE DATABASE OPEN READ ONLY;

我们可以像任何其他PDB一样删除现有的应用程序种子。这对使用它创建的应用程序容器PDB没有影响。

ALTER PLUGGABLE DATABASE sales_app$SEED CLOSE;DROP PLUGGABLE DATABASE sales_app$SEED INCLUDING DATAFILES;

要从我们之前创建的sales_app应用程序容器创建应用程序种子,我们将执行以下操作。

CREATE PLUGGABLE DATABASE AS SEED FROM sales_app_pdb;ALTER PLUGGABLE DATABASE sales_app$SEED OPEN;ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;ALTER PLUGGABLE DATABASE OPEN READ ONLY;

要从应用程序根目录创建应用程序种子,我们将执行以下操作。open命令将导致一些违规,但可以忽略它们,因为“pdb_to_apppdb.sql”将修复它们。

CREATE PLUGGABLE DATABASE AS SEED FROM sales_app;ALTER PLUGGABLE DATABASE sales_app$SEED OPEN;ALTER SESSION SET CONTAINER=sales_app$SEED;@$ORACLE_HOME/rdbms/admin/pdb_to_apppdb.sqlALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;ALTER PLUGGABLE DATABASE OPEN READ ONLY;

应用容器视图

以下视图可从应用程序根容器获得,在某些情况下,应用程序容器PDB可提供有关应用程序的信息。 

  • DBA_APPLICATIONS
  • DBA_APP_ERRORS
  • DBA_APP_PATCHES
  • DBA_APP_PDB_STATUS
  • DBA_APP_STATEMENTS
  • DBA_APP_VERSIONS

相关链接

Oracle Multitenant : Changes in Oracle Database Release 19c

Oracle Multitenant : DBCA PDB Remote Clone in Oracle Database 19c

Oracle Multitenant : DBCA PDB Relocate in Oracle Database 19c

参考《Overview of Applications in an Application Container》

  相关解决方案