在Oracle 12c的多租户(Multitenant)架构中,大家最熟悉的概念是容器数据库CDB和可插拔数据库PDB。但很多人不知道的是,从12.2版本开始,Oracle在CDB内部引入了一套更细粒度的容器结构,叫Application Container,也就是应用容器。它的设计初衷很实际:当多个PDB需要运行同一套应用程序、共享同一份基础数据(比如省份字典、产品编码表)时,如果每个PDB都各自维护一份,不但浪费空间,升级应用时还要挨个PDB去改,运维成本极高。应用容器就是为了解决这个问题而生的。

应用容器的组成结构与传统CDB Root的区别
一个应用容器由三部分组成:应用根容器(Application Root)、应用PDB(Application PDB)以及可选的应用种子(Application Seed)。应用根容器是一种特殊的PDB,它挂载在CDB Root之下,但行为上类似一个小型的管理根,可以再挂载自己的应用PDB,形成了一棵容器树。也就是说,CDB Root是整棵树的根,应用根容器是中间层的根,应用PDB挂在应用根容器之下。
这和传统方式的区别在于:普通PDB直接挂在CDB Root下,彼此完全独立,共享的只有实例和后台进程;而应用容器内的PDB除了共享实例,还可以共享应用定义和公共数据。DBA可以连接到应用根容器,对整个应用容器执行统一的数据库操作,比如统一修改参数、统一打补丁脚本。
需要特别注意的是,应用容器中还有一个角色叫应用种子(Application Seed),类似于CDB中的seed PDB,它可以作为模板快速创建新的应用PDB,新创建的PDB会自动继承应用根容器中已经安装的应用,省去了重复安装的步骤。
如何创建应用容器并挂载应用PDB
创建应用容器的第一步是创建应用根容器。在创建PDB时指定as application container子句即可,具体语句如下:
-- 连接到CDB Root创建应用根容器
SQL> CONNECT sys/oracle@localhost:1521/cdb1 AS SYSDBA
-- 创建应用根容器,名为approot1
SQL> CREATE PLUGGABLE DATABASE approot1 AS APPLICATION CONTAINER
ADMIN USER appadmin IDENTIFIED BY oracle;
-- 打开应用根容器
SQL> ALTER PLUGGABLE DATABASE approot1 OPEN;
应用根容器创建好之后,接下来要连接到它,并在它之下创建应用PDB。注意此时必须先切换到应用根容器,否则创建出来的就是普通PDB:
-- 连接到应用根容器
SQL> CONNECT sys/oracle@localhost:1521/approot1 AS SYSDBA
-- 在应用根容器下创建应用PDB
SQL> CREATE PLUGGABLE DATABASE app_pdb1 ADMIN USER pdbadmin IDENTIFIED BY oracle;
-- 如果想用应用种子作为模板,可以先创建应用种子
SQL> CREATE PLUGGABLE DATABASE appseed
AS APPLICATION SEED
ADMIN USER seedadmin IDENTIFIED BY oracle;
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
创建完成后,可以通过查询DBA_PDBS视图确认容器层级关系。应用根容器的PDB_TYPE会显示为APPLICATION CONTAINER,应用种子的类型为APPLICATION SEED,应用PDB则显示为APPLICATION。从视图输出的层级关系可以清晰看到这棵容器树的结构。
在应用容器中安装应用并实现多PDB共享
应用容器最核心的概念是Application(应用),它是通过DBMS_CDB.CREATE_PACKAGE或者更常用的SQL语句CREATE PACKAGE声明的一个逻辑单元,可以理解为应用的名称加版本号。只有在应用容器中执行了应用安装脚本,公共对象才会被标记为可共享。下面演示一个完整流程,在应用根容器中创建一个名为SALES_APP的应用并安装共享表:
-- 连接到应用根容器
SQL> CONNECT sys/oracle@localhost:1521/approot1 AS SYSDBA
-- 开始应用安装,指定应用名和版本号
SQL> ALTER SESSION SET CONTAINER = approot1;
SQL> CREATE PACKAGE SALES_APP AS
PACKAGE VERSION 1.0;
-- 在应用根容器中创建公共表,使用SHARING子句声明共享方式
SQL> CREATE TABLE sales_region_sharing_metadata
SHARING = METADATA
(region_id NUMBER PRIMARY KEY,
region_name VARCHAR2(50));
-- 创建共享数据表,所有应用PDB引用同一份数据
SQL> CREATE TABLE sales_config_sharing_data
SHARING = DATA
(config_key VARCHAR2(50) PRIMARY KEY,
config_value VARCHAR2(200));
-- 结束应用安装
SQL> ALTER PACKAGE SALES_APP END INSTALL;
这里出现了两个关键的共享类型,必须区分清楚。SHARING = METADATA表示元数据链接,即应用PDB中只能看到这张表的结构定义,数据是各存各的,适合业务数据表;SHARING = DATA表示对象链接,即结构和数据都只有一份,存储在应用根容器中,所有应用PDB看到的是同一份数据,适合基础字典表和配置表。
应用安装完成后,还必须执行同步操作,应用PDB才能真正使用这个应用:
-- 连接到应用PDB并同步应用 SQL> CONNECT sys/oracle@localhost:1521/app_pdb1 AS SYSDBA SQL> ALTER SESSION SET CONTAINER = app_pdb1; SQL> ALTER PLUGGABLE DATABASE APPLICATION SALES_APP SYNC;
同步之后,在应用PDB中查询sales_config_sharing_data表,可以直接看到应用根容器中插入的数据,而sales_region_sharing_metadata表在应用PDB中则是空表,但结构与根容器完全一致。这正是两种链接方式的直观体现。
应用升级与常见陷阱
应用容器的另一个亮点是版本升级。当应用需要变更时,在应用根容器中执行ALTER PACKAGE ... BEGIN INSTALL 1.1开始升级,执行DDL变更后用END INSTALL结束,然后逐个应用PDB执行同步即可升级到新版本。升级过程中应用PDB在同步前仍然运行旧版本,可以实现滚动升级,这一点对多租户SaaS场景非常有用。
使用中有几个常见坑需要提醒。第一,所有DDL操作必须包裹在BEGIN INSTALL和END INSTALL之间,否则创建的对象不会被视为应用的组成部分,无法被应用PDB共享。第二,应用PDB必须显式执行同步语句,新插入的应用PDB不会自动获得应用,除非它是从应用种子克隆出来的。第三,对象链接表(SHARING = DATA)的数据修改只能在应用根容器中进行,直接在应用PDB中对这种表执行DML会报错,这一点和普通表的直觉不同。第四,应用容器要求Oracle 12.2及以上版本,12.1中不存在该特性。
总结来看,应用容器是Oracle多租户架构从实例共享走向应用和数据共享的重要一步。它通过应用根容器统一管理应用定义,通过元数据链接和对象链接灵活控制共享粒度,配合应用种子实现快速部署,非常适合多套同构系统共用一套字典和配置的场景。如果你的业务中存在大量结构相似、基础数据一致的PDB,应用容器值得认真评估。
Oracle 12cApplication Container应用容器多租户架构修改时间:2026-09-07 06:24:32