应用程序容器是Oracle Database 12c第2版(12.2)中的一项新功能,允许您定义应用程序根目录,如迷你CDB根容器,以及相关的应用程序容器PDB。应用程序根可以容纳一个或多个应用程序,每个应用程序由与应用程序根关联的可插拔数据库使用的共享配置,元数据和对象组成。
本文中的示例使用Oracle托管文件(OMF),因此不需要进行文件名转换。虽然目前尚未记录,但OMF对于应用程序容器同步是必需的。如果您需要,某些部分可以使用适当的FILE_NAME_CONVERT
或PDB_FILE_NAME_CONVERT
设置,但其他部分将失败。
从12.2开始,我们可以在单个CDB中拥有代理PDB,应用程序根容器和单个用户定义的PDB(常规或应用程序PDB),而无需支付多租户选项。请注意,我们仍然只限于一个用户定义的PDB。
配置OMF
set line 188
show parameter db_create_file_dest;
ALTER SYSTEM SET db_create_file_dest = '+data' scope=spfile;
管理应用程序根域
创建新的应用程序容器与创建常规PDB类似,但需要包含该AS APPLICATION CONTAINER
子句。
--- 创建一个应用PDB
CREATE 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 A10
SELECT 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 SYSDBA
ALTER SESSION SET container = sales_app_pdb;
SHOW CON_NAME
CON_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 exist
SQL>
-- 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 NUMBER
DESCRIPTION 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 A10
SELECT c.name,
aps.con_uid,
aps.app_name,
aps.app_version,
aps.app_status
FROM dba_app_pdb_status aps
JOIN 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 NORMAL
SQL>
升级应用程序
在本节中,我们将演示对我们在上一节中创建的应用程序的简单升级。
连接到应用程序根容器。
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
AS
l_desc reference_data.description%TYPE;
BEGIN
SELECT description
INTO l_desc
FROM reference_data
WHERE id = p_id;
RETURN l_desc;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 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_NAME
CON_NAME
------------------------------
SALES_APP_PDB
SQL>
-- Check for presence of application objects.
DESC ref_app_user.reference_data;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
DESCRIPTION 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 identifier
SQL>
-- 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 NUMBER
DESCRIPTION VARCHAR2(50)
CREATED_DATE DATE
SQL>
SELECT ref_app_user.get_ref_desc(1) FROM dual;
REF_APP_USER.GET_REF_DESC(1)
--------------------------------------------------------------------------------
Description of 1
SQL>
我们可以看到对表的修改,并且在同步操作之后新功能变得可见。
现在,该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 A10
SELECT c.name,
aps.con_uid,
aps.app_name,
aps.app_version,
aps.app_status
FROM dba_app_pdb_status aps
JOIN 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 NORMAL
SQL>
卸载应用程序
在本节中,我们将卸载我们之前创建的应用程序。
连接到应用程序根容器。
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_NAME
CON_NAME
------------------------------
SALES_APP_PDB
SQL>
-- Check for presence of application objects.
DESC ref_app_user.reference_data;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
DESCRIPTION VARCHAR2(50)
CREATED_DATE DATE
SQL>
SELECT ref_app_user.get_ref_desc(1) FROM dual;
REF_APP_USER.GET_REF_DESC(1)
--------------------------------------------------------------------------------
Description of 1
SQL>
-- 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 exist
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 identifier
SQL>
我们可以看到同步操作从应用程序容器中删除了应用程序。
现在,应用程序已标记为已卸载应用程序PDB。
CONN / AS SYSDBA
ALTER SESSION SET container = sales_app;
COLUMN name FORMAT A20
COLUMN app_name FORMAT A20
COLUMN app_version FORMAT A10
SELECT c.name,
aps.con_uid,
aps.app_name,
aps.app_version,
aps.app_status
FROM dba_app_pdb_status aps
JOIN 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 UNINSTALLED
SQL>
应用通用对象
在应用程序中创建的对象称为应用程序公共对象,可以采用三种形式之一。
- 元数据链接(
METADATA
):应用程序根保存所有链接的PDB将使用元数据链接引用的元数据信息。这可用于集中应用程序对象的定义,但所有数据都将保存在本地,而不是集中保存。 - Data-Linked(
DATA
):应用程序根目录包含对象的元数据和数据。所有链接的PDB都将引用集中式元数据和数据。数据链接类似于同义词,但在容器之间。 - Extended Data-Linked(
EXTENDED DATA
):应用程序根用于保存对象的元数据和数据。所有链接的PDB都将引用集中式元数据和数据。除了中央共享数据之外,本地应用程序PDB还可以插入其自己的数据,其他PDB无法看到。
该DEFAULT_SHARING
参数具有METADATA
默认值,用于确定所使用的默认共享类型。
SHOW PARAMETER default_sharing
NAME 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 action
SQL>
以下示例用于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.sql
ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE OPEN READ ONLY;
应用容器视图
以下视图可从应用程序根容器获得,在某些情况下,应用程序容器PDB可提供有关应用程序的信息。
相关链接
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