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. 最佳实践
- SaaS 场景使用 Application Container:多租户应用
- 共享元数据用 SHARED=METADATA:每个客户独立数据
- 共享配置用 SHARED=DATA:所有客户共享
- Application Seed 用于新 PDB:快速创建
- 版本管理:每次变更升级版本
- Patch 用于小变更:不升级版本
- 所有 PDB 定期 SYNC:保持一致
- Application Root 严格管理:变更控制
- 监控同步状态:dba_applications
- 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