Oracle Application Container(应用容器)

Oracle Application Container(应用容器)

适用版本:Oracle Database 12.2 / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Application Container(应用容器) 是 12.2 引入的多租户扩展[1],支持共享应用的 PDB 集合:

CDB$ROOT
  ├── Application Root (approot)
  │     ├── Application PDB 1
  │     ├── Application PDB 2
  │     └── Application PDB 3
  ├── HRPDB (普通 PDB)
  └── SALESPDB (普通 PDB)

适用场景:SaaS 多租户应用,共享元数据但数据独立。


2. 架构

2.1 三层结构

+--------------------------------+
| CDB$ROOT                       |
|  (CDB Root)                    |
+--------------------------------+


+--------------------------------+
| Application Root               |
|  (如 approot_sales)            |
|   - 共享元数据                  |
|   - Application 安装           |
|   - Application Seed           |
+--------------------------------+
   │      │      │
   ▼      ▼      ▼
 PDB1   PDB2   PDB3
 (SaaS 客户 1/2/3)

2.2 三种 PDB 类型

类型说明
Application Root应用根容器
Application PDB应用 PDB
Application Seed应用种子 PDB

3. 创建 Application Root

3.1 创建

-- 在 CDB$ROOT 创建
ALTER SESSION SET CONTAINER = CDB$ROOT;

CREATE PLUGGABLE DATABASE approot 
  AS APPLICATION USER admin IDENTIFIED BY ******

-- 打开
ALTER PLUGGABLE DATABASE approot OPEN;
ALTER SESSION SET CONTAINER = approot;

3.2 切换到 Application Root

ALTER SESSION SET CONTAINER = approot;
SELECT sys_context('USERENV','CON_NAME') FROM dual;
-- APPROOT

4. 安装 Application

4.1 开始安装

-- 在 Application Root 中
ALTER SESSION SET CONTAINER = approot;

-- 开始安装
ALTER PLUGGABLE DATABASE APPLICATION sales_app 
  BEGIN INSTALL 'v1.0';

4.2 创建共享对象

-- 共享元数据(仅元数据共享,数据独立)
CREATE TABLE shared_users (
  id NUMBER PRIMARY KEY,
  username VARCHAR2(100)
) SHARED=METADATA;

-- 共享数据(所有 PDB 共享数据)
CREATE TABLE shared_config (
  config_key VARCHAR2(100),
  config_value VARCHAR2(500)
) SHARED=DATA;

-- 创建本地对象(每个 PDB 独立)
CREATE TABLE sales_data (
  id NUMBER PRIMARY KEY,
  amount NUMBER
);

4.3 结束安装

ALTER PLUGGABLE DATABASE APPLICATION sales_app END INSTALL;

5. 创建 Application Seed

5.1 从 Application Root 创建

ALTER SESSION SET CONTAINER = approot;

CREATE PLUGGABLE DATABASE AS SEED;

-- 打开
ALTER PLUGGABLE DATABASE approot$seed OPEN;

-- 同步
ALTER SESSION SET CONTAINER = approot$seed;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

6. 创建 Application PDB

6.1 从 Application Seed 创建

-- 在 Application Root 中
ALTER SESSION SET CONTAINER = approot;

CREATE PLUGGABLE DATABASE tenant1 
  ADMIN USER admin IDENTIFIED BY ******

-- 打开
ALTER PLUGGABLE DATABASE tenant1 OPEN;

-- 同步 Application
ALTER SESSION SET CONTAINER = tenant1;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

6.2 验证同步

-- 在 tenant1 中
ALTER SESSION SET CONTAINER = tenant1;

-- 应用版本
SELECT app_name, app_version, app_status 
FROM dba_applications;

-- 共享表
SELECT table_name, sharing 
FROM dba_tables 
WHERE sharing <> 'NONE';

7. Application 升级

7.1 开始升级

-- 在 Application Root 中
ALTER SESSION SET CONTAINER = approot;

ALTER PLUGGABLE DATABASE APPLICATION sales_app 
  BEGIN UPGRADE 'v1.1';

7.2 修改对象

-- 添加列
ALTER TABLE shared_users ADD (email VARCHAR2(200));

-- 创建新对象
CREATE TABLE shared_orders (
  id NUMBER PRIMARY KEY,
  user_id NUMBER,
  amount NUMBER
) SHARED=METADATA;

7.3 结束升级

ALTER PLUGGABLE DATABASE APPLICATION sales_app END UPGRADE;

7.4 同步到 Application PDB

-- 每个 Application PDB 同步
ALTER SESSION SET CONTAINER = tenant1;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

ALTER SESSION SET CONTAINER = tenant2;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

8. Application Patch

8.1 创建 Patch

-- 在 Application Root 中
ALTER SESSION SET CONTAINER = approot;

ALTER PLUGGABLE DATABASE APPLICATION sales_app 
  BEGIN PATCH 101;

-- 修改对象
ALTER TABLE shared_users ADD (phone VARCHAR2(20));

ALTER PLUGGABLE DATABASE APPLICATION sales_app END PATCH;

8.2 同步 Patch

ALTER SESSION SET CONTAINER = tenant1;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

9. SHARED 类型详解

9.1 SHARED 选项

选项说明
METADATA元数据共享,数据独立
DATA元数据和数据都共享
NONE完全独立(默认)

9.2 METADATA 模式

-- 创建
CREATE TABLE shared_users (
  id NUMBER PRIMARY KEY,
  username VARCHAR2(100)
) SHARED=METADATA;

-- tenant1 中
ALTER SESSION SET CONTAINER = tenant1;
INSERT INTO shared_users VALUES (1, 'alice');
COMMIT;

-- tenant2 中(独立数据)
ALTER SESSION SET CONTAINER = tenant2;
INSERT INTO shared_users VALUES (1, 'bob');
COMMIT;

9.3 DATA 模式

-- 创建
CREATE TABLE shared_config (
  config_key VARCHAR2(100),
  config_value VARCHAR2(500)
) SHARED=DATA;

-- 在 Application Root 插入
ALTER SESSION SET CONTAINER = approot;
INSERT INTO shared_config VALUES ('max_users', '1000');
COMMIT;

-- 所有 PDB 共享该数据

10. 监控 Application Container

10.1 Application 列表

-- Application Root 中
SELECT 
  app_name, 
  app_version, 
  app_id, 
  app_status,
  app_capture_time
FROM dba_applications;

10.2 PDB 列表

SELECT 
  con_id, 
  name, 
  open_mode, 
  application_root, 
  application_pdb, 
  application_seed
FROM v$pdbs;

10.3 Application 同步状态

-- 每个 PDB 的 Application 状态
SELECT 
  p.name AS pdb_name,
  a.app_name,
  a.app_version,
  s.app_status,
  s.sync_time
FROM dba_applications a, 
     v$pdbs p, 
     dba_app_statements s
WHERE s.app_id = a.app_id
ORDER BY p.name;

11. 常见坑与排错

11.1 ORA-65346: 不能修改共享对象

现象:在 Application PDB 中修改共享对象失败。

修复

-- 共享对象的修改必须在 Application Root 中
ALTER SESSION SET CONTAINER = approot;
ALTER PLUGGABLE DATABASE APPLICATION sales_app BEGIN UPGRADE 'v1.2';
ALTER TABLE shared_users ADD (email VARCHAR2(200));
ALTER PLUGGABLE DATABASE APPLICATION sales_app END UPGRADE;

-- 同步到 PDB
ALTER SESSION SET CONTAINER = tenant1;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

11.2 ORA-65345: Application 不存在

现象:SYNC 失败。

修复

-- 1. 检查 Application 是否安装
ALTER SESSION SET CONTAINER = approot;
SELECT app_name FROM dba_applications;

-- 2. 必须先安装才能 SYNC

11.3 ORA-65338: 不能创建 Application 对象

现象:创建共享对象失败。

修复

-- 1. 必须在 Application Root 中
ALTER SESSION SET CONTAINER = approot;

-- 2. 必须在 INSTALL 或 UPGRADE 中
ALTER PLUGGABLE DATABASE APPLICATION sales_app BEGIN INSTALL 'v1.0';
CREATE TABLE shared_tab (...) SHARED=METADATA;
ALTER PLUGGABLE DATABASE APPLICATION sales_app END INSTALL;

11.4 Application PDB 不同步

现象:PDB 缺少 Application 对象。

修复

-- SYNC
ALTER SESSION SET CONTAINER = tenant1;
ALTER PLUGGABLE DATABASE APPLICATION sales_app SYNC;

11.5 删除 Application PDB 失败

修复

-- 在 Application Root 中删除
ALTER SESSION SET CONTAINER = approot;
ALTER PLUGGABLE DATABASE tenant1 CLOSE;
DROP PLUGGABLE DATABASE tenant1;

12. 最佳实践

  1. SaaS 场景使用 Application Container:多租户应用
  2. 共享元数据用 SHARED=METADATA:每个客户独立数据
  3. 共享配置用 SHARED=DATA:所有客户共享
  4. Application Seed 用于新 PDB:快速创建
  5. 版本管理:每次变更升级版本
  6. Patch 用于小变更:不升级版本
  7. 所有 PDB 定期 SYNC:保持一致
  8. Application Root 严格管理:变更控制
  9. 监控同步状态:dba_applications
  10. Application 审计:变更记录

13. 参考资料

[1] Oracle Multitenant Administrator’s Guide 19c, “Application Containers” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/managing-application-containers.html

[2] Oracle Multitenant Administrator’s Guide 19c, “Creating an Application Container” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/creating-an-application-container.html