DBCA创建CDB时必须勾选“创建为容器数据库”,否则无法后续升级;该选项为一次性决定,安装后不可更改,且PDB默认MOUNTED需手动OPEN,资源分配需通过资源计划实现而非DBCA界面配置。
DBCA 创建 CDB 时必须勾选“创建为容器数据库”
不勾选该选项,后续无法通过 dbca 直接升级为 cdb,也不能创建 pdb。oracle 12c 及以上版本中,“是否启用多租户”是建库时的**一次性决定项**,安装后无法回退修改。
常见错误现象:ORA-65096: invalid common user or role name 或 ORA-65131: the SELECT privilege cannot be granted to a common user,往往源于误建为非 CDB,却在 SQL*Plus 中执行了 CDB/PDB 专用语法。
- DBCA 图形界面中,在“数据库模板”页之后的“配置选项”页,务必勾选 “创建为容器数据库(Create as Container Database)”
- 勾选后会自动激活“容器数据库名称(CDB Name)”和“PDB 名称(Pluggable Database Name)”字段;若留空,DBCA 会使用默认名
CDB$ROOT和PDB$SEED,但建议显式填写自定义 PDB 名(如hrpdb),避免后续混淆 - 资源分配不是在此步设置——DBCA 不提供图形化界面直接分配 CPU/内存给 PDB,它只负责初始化 CDB 结构和创建第一个 PDB(seed + 一个可写 PDB)
创建后立即验证 CDB 模式与 PDB 状态
DBCA 完成后不要直接连 PDB,先确认 CDB 是否真正启用、PDB 是否已创建且处于 READ WRITE 状态。很多问题其实卡在 PDB 默认是 MOUNTED 状态,未自动 OPEN。
连接到 CDB root:sqlplus / as sysdba,然后运行:
SELECT NAME, CDB, CON_ID FROM V$DATABASE;
输出中 CDB 列应为 YES;再查 PDB:
SELECT CON_ID, NAME, OPEN_MODE, RESTRICTED FROM V$PDBS;
- 若新建 PDB 的
OPEN_MODE是MOUNTED,需手动打开:ALTER PLUGGABLE DATABASE <pdb_name> OPEN;</pdb_name> - 若
OPEN_MODE是READ ONLY,说明它被设为只读(例如基于 seed 克隆但未指定READ WRITE),需用ALTER PLUGGABLE DATABASE <pdb_name> OPEN READ WRITE;</pdb_name> - 首次登录 PDB 前,确保已创建本地用户并授予
CREATE SESSION,因为SYS和SYSTEM在 PDB 中默认不可直接登录(除非加AS SYSDBA且连接串明确指定 PDB service_name)
资源分配靠 CDB 级别参数与 PDB 级别资源计划,不是 DBCA 勾选项
DBCA 中没有“给 PDB 分配 2GB 内存”或“限制 CPU 使用率 30%”的滑块或输入框。Oracle 12c 的资源管理分两层:CDB 层控制整体资源池,PDB 层通过 DBMS_RESOURCE_MANAGER 绑定资源计划(Resource Plan)实现配额。
- CDB 级资源限制由初始化参数控制,例如:
MEMORY_TARGET、CPU_COUNT,它们约束整个 CDB,PDB 共享这些资源 - 真正隔离 PDB 资源需启用资源管理器:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'DEFAULT_PLAN';(仅对 CDB root 有效) - 每个 PDB 需单独创建并启用自己的资源计划,例如在
hrpdb中运行:EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();→ 定义 consumer group → 创建 plan →VALIDATE_PENDING_AREA→SUBMIT_PENDING_AREA→ 最后ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'HRPDB_PLAN'; - 若跳过资源计划配置,所有 PDB 将共享 CDB 资源,无硬性隔离——这也是多数测试环境“感觉不到资源分配效果”的原因
连接 PDB 必须用 service_name,不能只靠 SID
这是最常被忽略的操作细节。CDB 启动后,监听器默认只注册 CDB 的全局数据库名(ORACLE_SID 对应的服务名),而 PDB 的 service_name 是独立注册的,需手动检查或配置。
- 查看当前注册的服务:
lsnrctl status,输出中应看到类似Service "hrpdb.example.com" has 1 instance(s)的条目 - 若没出现,需在 PDB 中执行:
ALTER PLUGGABLE DATABASE <pdb_name> SAVE STATE;</pdb_name>(12.1.0.2+ 才支持自动恢复服务注册);或重启监听器 + CDB - tnsnames.ora 中连接 PDB 的条目必须用
SERVICE_NAME,例如:(SERVICE_NAME = hrpdb),而非(SID = orcl);用 SID 连只会进入 CDB$ROOT - SQL*Plus 中快速切换:
ALTER SESSION SET CONTAINER = hrpdb;仅在已连接 CDB root 且有相应权限时有效,不能替代 service_name 连接
资源计划配置复杂、service_name 注册易遗漏、PDB 默认不 OPEN——这三个点卡住的人最多。做一次完整流程前,先跑通这三步,比反复重装 CDB 更省时间。


















