Oracle 21c强制启用CDB架构,安装即创建CDB$ROOT和默认PDB,无non-CDB选项;连接默认进入CDB$ROOT,业务操作须先切换容器并手动启动PDB,用户需区分C##公共用户与本地用户。

Oracle 21c 中无法“配置”多租户——它已强制启用,你只能确认、切换和管理 CDB/PDB。 安装即 CDB,没有开关,也没有回退路径。所有操作都围绕这个前提展开。
安装时选“单实例数据库”就等于创建 CDB
别被“单实例”字面意思误导:21c 的安装向导里根本不存在 non-CDB 选项。你点“创建并配置单实例数据库”,dbca 就会自动:
- 初始化
CDB$ROOT容器,并写死V$DATABASE.CDB = 'YES' - 默认创建一个 PDB(如
ORCLPDB1),名字可自定义但不可跳过 - 在
listener.ora中注册两个服务名:orcl(指向 CDB)和orclpdb(指向 PDB) - 生成两个可用连接串:
sqlplus / as sysdba进CDB$ROOT,sqlplus sys@orclpdb as sysdba进 PDB
连接后第一件事:确认当前容器
刚连上 sqlplus / as sysdba,你以为进了“库”,其实只在 CDB$ROOT。不切换就建用户、建表,大概率触发 ORA-65096 错误。
必须立刻执行:
SHOW CON_NAME;
或
SELECT SYS_CONTEXT('USERENV','CON_NAME') FROM dual;
如果返回 CDB$ROOT,而你要操作业务对象,就得切过去:
ALTER SESSION SET CONTAINER = orclpdb;
注意:orclpdb 是服务名,不是 PDB 名;PDB 名可通过 SHOW PDBS 查看,且大小写敏感。
启动 PDB 是手动操作,不是自动的
即使安装时创建了 PDB,服务器重启后它默认是 MOUNTED 状态,不会自动 OPEN。连接 sys@orclpdb 会报 ORA-01033: ORACLE initialization or shutdown in progress。
需以 sysdba 连入 CDB 后显式启动:
ALTER PLUGGABLE DATABASE orclpdb OPEN;
或批量启动:
ALTER PLUGGABLE DATABASE ALL OPEN;
常见坑:
- 没启动 PDB 就去连服务名,
tnsping orclpdb能通,sqlplus却连不上 - 用
startup命令只启 CDB 实例,不等于启了 PDB - PDB 启动失败常因数据文件路径不对,查
DBA_PDBS和CDB_DATA_FILES对齐路径
建用户必须分清 common user 和 local user
在 CDB$ROOT 下建用户,用户名必须带 C## 前缀,否则报 ORA-65096:
CREATE USER c##appuser IDENTIFIED BY pwd;
在 PDB 下建用户,就不用前缀,但前提是已 ALTER SESSION SET CONTAINER = orclpdb:
CREATE USER appuser IDENTIFIED BY pwd;
关键区别:
-
C##用户在所有容器可见(CDB + 所有 PDB),权限需用GRANT ... CONTAINER=ALL显式指定 - 普通用户名只在当前 PDB 生效,跨 PDB 需各自创建
- 应用开发几乎全走 local user 路线,
C##用户只用于 DBA 管理或跨 PDB 工具账号
最易被忽略的一点:PDB 的 open_mode 默认是 READ WRITE,但如果你用 CREATE PLUGGABLE DATABASE ... FILE_NAME_CONVERT 手动建新 PDB,它初始状态是 MOUNTED,且不会自动加入 init.ora 或 spfile 的自动启动列表——下次重启 CDB,它依然不会开。这不像安装时默认生成的那个 PDB,dbca 已帮你写进启动依赖了。


















