导读:本期聚焦于三上悠亚创作的《Oracle 12c Application Container应用容器是什么?如何创建和使用?》,敬请观看详情。提到Oracle 12c的多租户架构,大部分人首先想到的是CDB和PDB,但应用容器(Application Container)这个特性却经常被误解或忽略。应用容器是Oracle 12.2之后引入的一组特殊容器结构,它由一个应用根容器(Application Root)和若干应用PDB组成,核心价值在于共享主数据和应用定义,让多个PDB以元数据链接或对象链接的方式引用同一份公共对象。本文将厘清应用容器与传统根容器CDB Root的区别,讲解应用根容器、应用种子、应用PDB之间的关系,并通过完整SQL示例演示如何创建应用容器、安装应用、同步应用版本,最后分析元数据链接与对象链接的差异以及使用中的常见陷阱,帮助你在多租户部署中真正发挥应用容器的价值。

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

Oracle 12c Application Container应用容器是什么?如何创建和使用?

应用容器的组成结构与传统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 INSTALLEND INSTALL之间,否则创建的对象不会被视为应用的组成部分,无法被应用PDB共享。第二,应用PDB必须显式执行同步语句,新插入的应用PDB不会自动获得应用,除非它是从应用种子克隆出来的。第三,对象链接表(SHARING = DATA)的数据修改只能在应用根容器中进行,直接在应用PDB中对这种表执行DML会报错,这一点和普通表的直觉不同。第四,应用容器要求Oracle 12.2及以上版本,12.1中不存在该特性。

总结来看,应用容器是Oracle多租户架构从实例共享走向应用和数据共享的重要一步。它通过应用根容器统一管理应用定义,通过元数据链接和对象链接灵活控制共享粒度,配合应用种子实现快速部署,非常适合多套同构系统共用一套字典和配置的场景。如果你的业务中存在大量结构相似、基础数据一致的PDB,应用容器值得认真评估。

Oracle 12cApplication Container应用容器多租户架构修改时间:2026-09-07 06:24:32

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260907/52032.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。