1. 多租户架构总览

Oracle 多租户(Multitenant)架构是 12c 引入的一次根本性架构变革。它把过去"一个数据库实例对应一套数据文件、一个数据字典"的单体模式,改造成"一个容器数据库(CDB)承载多个可插拔数据库(PDB)"的共享模式。理解这套架构,关键要抓住三个层次:CDB 是容器,PDB 是租户,而根容器(CDB$ROOT)与种子(PDB$SEED)是系统自带的两个特殊容器。

CDB 本身是一个完整的 Oracle 数据库实例,拥有自己的后台进程、SGA、控制文件、UNDO 表空间和一套统一的系统数据字典。PDB 则是一组独立的数据文件集合,它共享 CDB 的实例资源,但拥有自己的本地数据字典、自己的应用表空间、自己的用户与对象命名空间。换句话说,实例是共享的,数据是隔离的。这正是多租户架构最核心的价值主张:用一套实例资源,承载多个逻辑上彼此独立的数据库。

CDB$ROOT 存放 Oracle 提供的元数据与公共对象,是所有 PDB 的"根";PDB$SEED 是一个只读模板,用于快速克隆新 PDB;用户创建的 PDB 才是真正承载业务数据的租户。

从连接路径看,客户端既可以连接到 CDB 根容器执行全局管理操作,也可以直接连接到某个 PDB 执行应用级操作。当会话处于根容器时,查询 V$PDBS 可以看到当前所有 PDB 的名称、打开模式与状态;当会话切换到某个 PDB 后,V$DATABASE 返回的 DB_NAME 仍是 CDB 名,但 SYS_CONTEXT('USERENV','CON_NAME') 会返回当前 PDB 名。这个"容器上下文"的概念,是后续所有多租户管理操作的基础。

CDB 容器数据库(共享实例:SGA + 后台进程 + 控制文件 + UNDO) CDB$ROOT 公共数据字典 公共用户 / 公共对象 全局管理入口 PDB$SEED 只读模板 用于克隆新 PDB 不可直接连接 PDB1(销售) 本地数据字典 应用表空间 SALES_DATA 本地用户 APP_SALES 状态:READ WRITE PDB2(财务) 本地数据字典 应用表空间 FIN_DATA 本地用户 APP_FIN 状态:READ WRITE PDB3(测试) 本地数据字典 应用表空间 TEST_DATA 本地用户 APP_TEST 状态:MOUNTED 共享层(所有 PDB 共用) SGA 内存区 · 后台进程(PMON/SMON/DBWn/LGWR) · 控制文件 · UNDO 表空间 · 归档日志 · 参数文件 PDB 之间通过 CDB 统一管理,但数据文件、字典、用户、对象彼此隔离 连接 连接 连接

与传统非 CDB 架构的对比

在非 CDB 架构中,每个数据库都是"一个实例 + 一套数据文件 + 一套数据字典"的完整独立单元。如果一台服务器上要跑 10 个应用,就需要 10 个实例、10 份 SGA、10 套后台进程。这种模式的问题非常直接:内存开销随数据库数量线性增长,升级补丁要逐个实例执行,备份恢复策略要逐库维护,主数据(如公共用户、公共配置)无法统一管理。

多租户架构把"实例"与"数据"解耦。10 个应用可以共享 1 个 CDB 实例,每个应用对应 1 个 PDB。SGA 只需分配一份,后台进程只需运行一组,补丁只需在 CDB 层面执行一次即可覆盖所有 PDB。代价是:PDB 之间虽然数据隔离,但共享实例资源,因此一个 PDB 的异常负载可能影响同 CDB 内其他 PDB,需要通过资源管理器(Resource Manager)设置 CPU、并行度、I/O 等资源上限来约束。

对比维度 传统非 CDB 多租户 CDB/PDB
实例数量 每库一个实例 一个 CDB 实例承载多个 PDB
内存开销 随库数量线性增长 共享 SGA,显著降低
数据字典 每库独立 CDB 公共字典 + PDB 本地字典
补丁升级 逐库执行 CDB 层面一次执行
隔离级别 实例级完全隔离 数据隔离,资源需配额约束
迁移方式 导出导入或传输表空间 PDB 可插拔,直接 unplug/plug

多租户演进历程与适用场景

Oracle 12c 首次引入多租户,当时一个 CDB 最多支持 252 个 PDB;18c 将上限提升到 253 个,并引入 PDB 快照克隆;19c 成为长期支持版本,多租户成为默认架构,同时支持 PDB 级别的闪回与热克隆;21c 进一步引入 PDB 级别的 Data Guard 和只读 PDB 的自动扩展;23c 则把多租户作为唯一架构,非 CDB 正式退出历史舞台。这条演进路线说明:多租户不是可选特性,而是 Oracle 数据库的既定方向。

那么,哪些场景最适合采用多租户架构?第一类是多应用整合:企业内多个中小型应用原本各自独立部署,可以合并到同一个 CDB 中,降低服务器与运维成本。第二类是SaaS 多租户:每个客户一个 PDB,数据天然隔离,同时共享底层资源,扩容时只需克隆 PDB 模板。第三类是开发测试环境:利用 PDB 快照或克隆,可以在秒级创建一份与生产数据一致的测试库,用完即删。第四类是数据库版本升级:把旧版本数据库迁移为 PDB,插入新版本 CDB,实现平滑升级。

判断是否适合多租户,可以问三个问题:这些数据库是否共享同一套运维窗口?是否愿意接受实例级资源共享?是否需要频繁克隆或迁移?如果答案偏向"是",多租户通常比独立部署更划算。

需要特别注意的是,PDB 的"可插拔"能力是多租户架构区别于其他共享方案的关键。一个 PDB 可以被 unplug 成一个独立的 XML 描述文件加数据文件集合,然后 plug 到另一个 CDB 中,整个过程不需要导出导入数据。这种能力让数据库的迁移、升级、灾备都获得了前所未有的灵活性。理解 CDB 与 PDB 的层次关系、共享边界与隔离边界,是后续学习 PDB 创建、切换、资源管理与备份恢复的前提。