关注

一库容百库:深度解析Oracle多租户架构CDB与PDB的核心奥秘


🌺The Begin🌺点点关注,收藏不迷路🌺


一、开篇颠覆认知:为什么Oracle要搞“合租房”?

在Oracle 12c之前,一家公司如果有10个业务系统,通常需要创建10套独立的数据库实例。每个实例都有自己的SGA、后台进程、参数文件,就像10栋独立别墅,占用了大量服务器资源。

Oracle 12c推出的多租户架构(Multitenant Architecture) 彻底改变了这一局面。它让多个“可插拔数据库”共享同一个实例,就像把独立别墅改成了共享大堂的高层公寓——公摊面积(SGA、后台进程)大家分摊,自家房间(PDB)各过各的日子。

一组震撼的数据:

  • 传统10个实例:需要10块SGA、10组后台进程、10份参数文件维护。
  • 多租户1个CDB+10个PDB:只需1块SGA、1组后台进程、1份参数文件。硬件资源节省高达90%。

二、全景架构图:CDB与PDB的层次关系

先通过一张架构图,从整体上把握多租户架构的组织逻辑:

独立访问

应用级视图

系统级PDB

CDB实例

物理服务器

操作系统内存与CPU

实例 - 一组后台进程

SGA共享内存区

CDB$ROOT 根容器

PDB$SEED 种子容器

PDB1 - 财务系统

PDB2 - 人力资源系统

PDB3 - 销售系统

财务表空间与数据文件

HR表空间与数据文件

销售表空间与数据文件

财务应用连接PDB1

HR应用连接PDB2

销售应用连接PDB3

关键解读:

  • 蓝色(CDB$ROOT): 整个架构的“房东”,管理所有PDB的元数据。
  • 紫色(PDB$SEED): 只读模板库,快速创建新PDB的“克隆母体”。
  • 绿色(用户PDB): 真正的业务数据库,彼此逻辑隔离。
  • 橘色(应用连接): 每个PDB对外表现为一个独立数据库。

三、核心概念拆解:什么是CDB?什么是PDB?

1. CDB(Container Database):容器数据库

精确描述:
CDB是Oracle多租户架构的顶层容器,它包含一组PDB的集合。从物理层面看,它就是一个完整的Oracle数据库实例,但从逻辑层面看,它是零个或多个PDB的“宿主环境”。

CDB的三大组成部分:

序号组件名称角色定位核心功能
1CDB$ROOT根容器存储Oracle系统元数据、公共用户、公共对象
2PDB$SEED种子容器只读模板,用于快速克隆创建新PDB
3PDB可插拔数据库用户业务数据的实际存放地

CDB的核心特征:

  1. 实例只有一个: 一个CDB对应一个Oracle实例,所有PDB共享该实例的SGA和后台进程。
  2. 全局管控者: CDB$ROOT管理所有PDB的创建、打开、关闭、拔出、插入。
  3. 公共资源池: 公共用户、公共角色、公共权限在CDB$ROOT中统一管理。

2. PDB(Pluggable Database):可插拔数据库

精确描述:
PDB是Oracle多租户架构中的业务容器,它对应用程序来说就是一个完全独立的数据库。每个PDB拥有独立的表空间、数据文件、用户、权限、数据字典视图。

PDB的“四独立”特征:

  1. 独立的数据文件: 每个PDB有自己的物理数据文件,不与其他PDB共享。
  2. 独立的表空间: 财务PDB的表空间与HR PDB的表空间完全隔离。
  3. 独立的用户体系: PDB可以创建本地用户,该用户只能访问本PDB的数据。
  4. 独立的数据字典: 每个PDB内部查询 DBA_TABLES,只能看到自己的表。

PDB的三种状态:

  • OPEN READ WRITE: 正常读写,应用可访问。
  • OPEN READ ONLY: 只读模式,用于报表查询。
  • MOUNTED: 挂载但未打开,DBA可进行管理操作。

四、CDB与PDB的七大核心区别:一张表彻底分清

序号对比维度CDB(容器数据库)PDB(可插拔数据库)
1层级定位顶层容器,PDB的“宿主”容器内的“住户”,业务数据的实际载体
2实例关系一个CDB = 一个Oracle实例所有PDB共享同一个CDB实例
3数据独立性存储Oracle系统元数据完全独立的数据文件与表空间
4用户体系公共用户(Common User),对所有PDB可见本地用户(Local User),仅对本PDB有效
5可迁移性固定在一个实例上可拔出、插入到另一个CDB中
6数据库视图拥有全局视图 CDB_xxx只能看到本PDB的 DBA_xxx 视图
7备份恢复粒度必须备份整个CDB可单独备份和恢复某个PDB

五、多租户架构的四大核心优势:为什么必须上CDB?

1. 优势一:资源密度革命性提升

传统架构:

实例1(财务):SGA=2G, 后台进程=30个
实例2(HR):  SGA=2G, 后台进程=30个
实例3(销售):SGA=2G, 后台进程=30个
总计:SGA=6G, 进程=90个

多租户架构:

CDB实例(财务+HR+销售):SGA=4G, 后台进程=30个

SGA节省33%,进程数减少66%,一台服务器可以承载更多数据库。


2. 优势二:快速克隆与迁移

传统建库: 备份 → 还原 → 配置 → 调优,至少1小时。

PDB克隆:

-- 从PDB$SEED创建一个新PDB,只需几秒!
CREATE PLUGGABLE DATABASE pdb_new ADMIN USER admin IDENTIFIED BY passwd
FILE_NAME_CONVERT = ('/pdbseed/', '/pdb_new/');

PDB拔插迁移:

-- 将PDB从CDB1拔出
ALTER PLUGGABLE DATABASE pdb_sales CLOSE;
ALTER PLUGGABLE DATABASE pdb_sales UNPLUG INTO '/backup/pdb_sales.xml';

-- 将PDB插入CDB2
CREATE PLUGGABLE DATABASE pdb_sales USING '/backup/pdb_sales.xml';

跨服务器迁移一个数据库,只需几分钟,而不是传统RMAN备份还原的数小时。


3. 优势三:统一管理与滚动升级

统一打补丁:

  • 在CDB$ROOT打一个PSU补丁,所有PDB自动继承。
  • 不再需要逐个实例停机维护。

滚动升级策略:

  1. 将PDB从旧版本CDB拔出。
  2. 插入到新版本CDB中。
  3. 无需传统的数据导出导入。

4. 优势四:精细化的安全隔离

逻辑隔离保证:

  • 财务PDB的DBA只能管理财务PDB,看不到HR PDB的任何数据。
  • 应用只能连接到指定的PDB,无法跨PDB访问。

资源隔离:

-- 为每个PDB设置资源限制
ALTER SYSTEM SET CPU_COUNT=2 SCOPE=PDB;
ALTER SYSTEM SET SGA_TARGET=1G SCOPE=PDB;

六、多租户架构的内部运行机制:一条SQL的跨容器之旅

当应用连接到PDB执行查询时,Oracle内部是如何处理的?

PDB_FINANCE CDB$ROOT CDB实例 监听器 财务应用 PDB_FINANCE CDB$ROOT CDB实例 监听器 财务应用 整个过程中,应用完全感知不到CDB$ROOT的存在 请求连接PDB_FINANCE 创建Server Process 切换容器上下文到PDB_FINANCE SELECT * FROM BILLING 查询PDB本地数据字典 读取PDB私有数据文件 返回结果集

关键机制:连接PDB时,Oracle在PGA中切换容器上下文。应用以为自己连接的是独立数据库,实际上底层SGA和进程都是共享的。


七、实战操作:CDB环境下的日常管理

1. 查看当前所处的容器

-- 查看当前容器
SQL> SHOW CON_NAME;
CON_NAME
------------------------------
CDB$ROOT

-- 切换到指定PDB
SQL> ALTER SESSION SET CONTAINER = pdb_finance;
SQL> SHOW CON_NAME;
CON_NAME
------------------------------
PDB_FINANCE

2. 查询全局视图 vs 本地视图

-- 在CDB$ROOT查询所有PDB的数据文件
SELECT con_id, name FROM V$DATAFILE;

-- 在PDB内部查询,只能看到本PDB的数据文件
SELECT name FROM V$DATAFILE;

3. 创建公共用户 vs 本地用户

-- 在CDB$ROOT创建公共用户(所有PDB可见)
CREATE USER C##admin IDENTIFIED BY passwd CONTAINER=ALL;
GRANT DBA TO C##admin CONTAINER=ALL;

-- 在PDB内部创建本地用户(仅本PDB可见)
ALTER SESSION SET CONTAINER = pdb_finance;
CREATE USER finance_admin IDENTIFIED BY passwd;
GRANT DBA TO finance_admin;

八、多租户架构的适用场景与局限性

1. 最适合的场景

  • 数据库整合: 将几十个小数据库整合到一个CDB中,大幅节省资源。
  • 开发测试环境: 快速克隆生产PDB,秒级创建测试库。
  • SaaS多租户应用: 每个客户一个PDB,逻辑隔离,统一管理。
  • 数据库即服务(DBaaS): 云平台通过PDB提供独立数据库服务。

2. 需要谨慎的场景

  • 需要不同数据库版本: 所有PDB共享同一个Oracle二进制版本。
  • 需要不同字符集: CDB级别的字符集统一设定。
  • 极高的实例级隔离要求: PDB是逻辑隔离,不是物理隔离。

九、总结:多租户架构的“三个记住”

【CDB是公寓楼,PDB是精装房】

  • 记住一: CDB是唯一的实例,PDB是逻辑上的独立数据库。
  • 记住二: 所有PDB共享SGA和后台进程,但数据文件完全独立。
  • 记住三: PDB可以拔插迁移,这是Oracle向云原生架构演进的关键技术。

从Oracle 20c开始,多租户架构已经成为唯一支持的架构。如果你还在使用传统的非CDB数据库,现在是时候规划迁移了。

你的生产环境已经升级到CDB/PDB架构了吗?在迁移过程中遇到了哪些坑?欢迎在评论区分享你的实战经验。


在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_41840843/article/details/162770721

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--