oracle 21c默认不启用多租户,建库时必须指定enable pluggable database,否则无法创建pdb;已建非cdb不能在线转换,需导出重建;v$database.cdb=’yes’才表示真正启用容器模式。
创建cdb时必须指定 enable pluggable database
oracle 21c 默认不启用多租户架构,哪怕你装的是企业版。没加这个参数,后续根本无法创建pdb——不是报错,而是连 create pluggable database 命令都不存在。
建库时在 CREATE DATABASE 语句末尾加:ENABLE PLUGGABLE DATABASE;用 DBCA 图形工具则必须勾选 “Create as Container Database”。漏掉就等于白装,重来成本高。
- 如果已建好非CDB,不能在线转成CDB,只能导出再重建
-
V$DATABASE中CDB列为YES才算真正启用了容器模式 - 未启用时执行
SHOW CON_NAME会报ORA-01031: insufficient privileges(其实是功能不可用,不是权限问题)
连接CDB和PDB的tnsnames.ora配置容易混淆服务名
默认安装后,tnsnames.ora 只配了 CDB 的全局服务名(比如 ORCLCDB),但 PDB 的服务名默认是独立生成的,不是简单拼接出来的。
查当前PDB服务名:连进CDB后运行 SELECT NAME, DBID, OPEN_MODE FROM V$PDBS,再查对应服务:SELECT NAME FROM V$SERVICES WHERE NAME LIKE '%pdb1%'(假设PDB叫 PDB1)。常见错误是手动写成 ORCLCDB:PDB1 或 PDB1.ORCLCDB,实际服务名通常是 PDB1 或 PDB1.localdomain。
- 首次创建PDB后,建议立刻执行
ALTER PLUGGABLE DATABASE PDB1 SAVE STATE,否则重启CDB后PDB默认不自动打开 - tnsnames.ora 中服务名必须和
V$SERVICES.NAME完全一致,大小写敏感 - 用
sqlplus /@pdb1连不上?先确认lsnrctl status输出里有没有该服务名
COMMON_USER和LOCAL_USER权限边界很硬,跨PDB操作常被静默拒绝
Oracle 多租户下用户分两类:C## 开头的是 CDB 级公共用户,能在所有PDB里存在(但需显式授权);不带 C## 的是本地用户,只属于某个PDB。很多人以为用 sys as sysdba 连进PDB就能随便建用户,结果 CREATE USER u1 IDENTIFIED BY p1 报 ORA-65096: invalid common user or role name——因为当前容器是PDB,而没加 C## 前缀的语句被当成建 COMMON 用户处理。
- 在PDB里建本地用户,必须先
ALTER SESSION SET CONTAINER = PDB1,再CREATE USER app_user IDENTIFIED BY pwd - 在CDB$ROOT里建
C##admin,想让它在PDB里可用,得额外执行:GRANT CREATE SESSION TO C##admin CONTAINER=ALL -
CONTAINER=CURRENT(默认)和CONTAINER=ALL会影响视图查询范围,比如SELECT * FROM DBA_USERS在CDB里只返回当前容器的用户,除非加CONTAINER=ALL
初始化参数 scope=SPFILE + ALTER SYSTEM SET … CONTAINER=ALL 不总生效
有些参数(如 open_cursors、processes)支持在CDB级统一设,但像 db_recovery_file_dest、audit_trail 这类涉及物理路径或安全策略的,设成 CONTAINER=ALL 会失败,提示 ORA-02097: parameter cannot be modified because specified value is invalid。
根本原因是:这些参数在PDB里要么继承CDB值、要么必须单独设。强行统一设,Oracle 会校验每个PDB上下文是否合法——比如某个PDB正在只读打开状态,就不能改 audit_trail。
- 查参数是否支持多容器:查
V$PARAMETER.CON_ID,值为 0 表示CDB级有效,非0表示PDB专属 - 批量设PDB参数更稳妥的方式是写脚本循环:
ALTER SESSION SET CONTAINER = PDB1; ALTER SYSTEM SET open_cursors=1000; -
ALTER SYSTEM SET … SCOPE=BOTH在CDB里执行后,记得ALTER PLUGGABLE DATABASE ALL SAVE STATE,否则重启后PDB可能恢复旧值
最麻烦的不是不会设,而是设完没验证。CDB里改了参数,一定要进每个PDB查 SHOW PARAMETER xxx,别信“应该同步了”这种直觉。










