Oracle CDB 与 Non-CDB (NoCDB) 的区别
Oracle数据库中的CDB(Container Database,容器数据库)和Non-CDB(非容器数据库,也称为NoCDB)是两种不同的数据库架构,主要区别如下:
- 基本概念
CDB (Container Database):
12c版本引入的多租户架构
包含一个根容器(CDB$ROOT)和多个可插拔数据库(PDB)
允许多个PDB共享同一套数据库实例和后台进程
Non-CDB (NoCDB):
传统Oracle数据库架构
11g及之前版本的唯一架构形式
每个数据库完全独立,不共享资源
- 主要区别
特性 CDB Non-CDB
架构 多租户容器架构 单一独立架构
数据库数量 一个CDB可包含多个PDB 一个实例对应一个数据库
资源共享 PDB共享SGA、PGA和后台进程 不共享资源
管理方式 集中管理多个PDB 单独管理每个数据库
升级/补丁 只需升级CDB,所有PDB自动升级 每个数据库单独升级
数据字典 有CDB级别和PDB级别的数据字典 单一数据字典
12c以后版本默认 是 否(需特别指定) - 内部结构差异
CDB结构:
根容器(CDB$ROOT): 包含整个CDB的元数据
种子PDB(PDB$SEED): 创建新PDB的模板
用户PDB: 用户创建的实际可插拔数据库
公共用户: 在CDB级别创建,可访问所有PDB
本地用户: 仅在特定PDB内有效
Non-CDB结构:
单一数据库结构
所有用户和对象都在同一命名空间
无容器概念
- 使用场景
CDB适合:
需要管理多个相似数据库的环境
云环境或多租户应用
需要快速部署新数据库实例的场景
资源整合和统一管理的需求
Non-CDB适合:
传统单一应用数据库
需要完全隔离的环境
兼容旧版本的应用
特殊场景下对多租户有限制的环境
- 转换与兼容性
可以将Non-CDB转换为PDB(使用DBMS_PDB包)
PDB可以拔插到不同CDB中
大多数应用无需修改即可在PDB中运行
12c以后版本默认创建CDB,但可通过-noncdbcompatible参数创建Non-CDB
- DBA操作差异
CDB特有操作:
sql
– 查看所有PDB
SELECT name, open_mode FROM v$pdbs;
– 切换到特定PDB
ALTER SESSION SET CONTAINER=pdbname;
– 创建新PDB
CREATE PLUGGABLE DATABASE pdbname ADMIN USER pdbadmin IDENTIFIED BY password;
Non-CDB操作:
所有操作都在单一数据库上下文中执行
无需容器切换命令
- 性能考虑
CDB优势:
资源共享减少总体内存需求
集中管理降低维护成本
快速PDB克隆和部署
Non-CDB优势:
无多租户开销
完全独立的资源控制
避免"吵闹邻居"问题(一个PDB影响其他PDB)
在实际应用中,Oracle推荐使用CDB架构,特别是在12c及以后版本中,这是Oracle多租户战略的核心组成部分。