必须在CDB$ROOT中创建PDB,之后所有表空间、用户及扩容操作均须在目标PDB内执行;否则报ORA-65040。建库前需验证CDB=YES且CON_NAME=CDB$ROOT,建PDB后须OPEN并切换容器,再创建专属表空间、用户并绑定,禁用UNLIMITED TABLESPACE,启用Local UNDO,严格隔离文件路径。

必须在 CDB$ROOT 中创建 PDB,之后所有表空间和用户操作都必须切到对应 PDB 内执行,否则直接报 ORA-65040。
确认当前容器是 CDB$ROOT
新建 PDB 前第一件事不是 CREATE,而是验证位置。很多 DBA 在非根容器里执行建库命令,结果卡在 ORA-65040:operation not allowed from within a pluggable database。
- 查 CDB 状态:
SELECT NAME, CDB FROM V$DATABASE;—— 必须返回CDB=YES - 查当前容器:
SHOW CON_NAME;—— 必须是CDB$ROOT,不是PDB$SEED或其他 PDB 名 - 如果显示的是某个 PDB 名,立刻切回:
ALTER SESSION SET CONTAINER = CDB$ROOT;
建 PDB 后必须切容器再建表空间
PDB 创建后默认是 MOUNTED 状态,且所有业务表空间(USERS、INDEXES 等)必须在目标 PDB 内创建,不能复用 CDB$ROOT 的 SYSTEM 或 SYSAUX。
- 先打开并切换:
ALTER PLUGGABLE DATABASE PLUG4APP OPEN;→ALTER SESSION SET CONTAINER = PLUG4APP; - 建业务数据表空间时禁用 SYSTEM/SYSAUX:
CREATE TABLESPACE users_app DATAFILE '/u01/oradata/cdb1/plug4app/users01.dbf' SIZE 200M SEGMENT SPACE MANAGEMENT AUTO; - 临时表空间也得单独建:
CREATE TEMPORARY TABLESPACE temp_app TEMPFILE '/u01/oradata/cdb1/plug4app/temp01.dbf' SIZE 100M; - UNDO 表空间不用手动建(Local UNDO 已启用),但要确认:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';返回TRUE
用户绑定与权限回收是隔离落地的关键
表空间建完不等于租户就隔离了。用户若没绑定专属表空间、或仍持有 UNLIMITED TABLESPACE,就可能跨空间写入,破坏边界。
- 建用户时强制指定:
CREATE USER app4app IDENTIFIED BY pwd DEFAULT TABLESPACE users_app TEMPORARY TABLESPACE temp_app; - 立刻回收高危权限:
REVOKE UNLIMITED TABLESPACE FROM app4app; - 改用配额控制:
ALTER USER app4app QUOTA 500M ON users_app; - 验证是否生效:
SELECT username, default_tablespace, temporary_tablespace FROM dba_users WHERE username = 'APP4APP';
扩容操作必须在 PDB 内执行,且路径不能混用
后续业务增长需要加数据文件?别在 CDB$ROOT 下操作,也别复用其他 PDB 的路径。每个 PDB 的文件路径、自动扩展策略、甚至块大小都该独立管理。
- 扩永久表空间:
ALTER TABLESPACE users_app ADD DATAFILE '/u01/oradata/cdb1/plug4app/users02.dbf' SIZE 200M AUTOEXTEND ON NEXT 50M MAXSIZE 2G; - 扩临时表空间:
ALTER TABLESPACE temp_app ADD TEMPFILE '/u01/oradata/cdb1/plug4app/temp02.dbf' SIZE 100M; - 严禁把多个 PDB 的 datafile 放进同一个目录而不加子目录隔离,否则备份、迁移、I/O 监控全会乱套
最容易被忽略的点是 Local UNDO 的启用状态和 file_name_convert 的路径映射——前者不满足会导致跨 PDB 回滚段争用,后者配置错会直接让 PDB 创建失败或文件写到错误位置。这两个参数一旦设错,基本要重建 PDB 才能修正。











