必须先切换并验证当前容器为目标pdb,再执行表空间操作;否则建在cdb$root将对pdb无效。使用select sys_context('userenv', 'con_name') from dual确认容器名,若非目标pdb则执行alter session set container = pdb_name。

确认当前容器是否为目标PDB
在执行任何表空间操作前,必须确保会话已切换到目标PDB。误在CDB$ROOT下操作,会导致表空间建在根容器,对PDB无效,且后续用户无法使用。
- 运行
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL,结果必须是你的PDB名(如XEPDB1),不是CDB$ROOT - 若未切换,用
ALTER SESSION SET CONTAINER = XEPDB1(替换为实际PDB名);注意该命令需SYSDBA或具有SET CONTAINER权限的用户执行 -
SHOW CON_NAME可快速验证,但不能替代SYS_CONTEXT——某些客户端工具中SHOW可能缓存旧值
创建PDB专属表空间时路径与参数的关键点
PDB的DATAFILE路径必须独立于CDB和其他PDB,且Oracle不会自动创建父目录。路径写错或目录不存在,CREATE TABLESPACE会直接报ORA-01119或ORA-27040。
- 先查PDB实际数据文件位置:
SELECT name FROM v$datafile WHERE con_id = SYS_CONTEXT('USERENV', 'CON_ID') - 路径建议沿用同PDB其他数据文件的父目录,例如
'/u02/oradata/XE/XEPDB1/my_ts01.dbf',避免跨盘符或硬编码Windows路径(如D:\...) -
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED是安全起点;若业务写入量大,NEXT值太小会导致频繁扩展,影响性能 - 不要省略
SIZE——即使设MAXSIZE UNLIMITED,初始SIZE为0会触发ORA-01143
将表空间绑定给用户的正确方式
仅创建表空间不等于用户能用。必须显式设置默认表空间并授予配额,否则用户建表时仍走SYSTEM或报ORA-01950(no privileges on tablespace)。
- 先确认用户存在且属于当前PDB:
SELECT username, default_tablespace FROM dba_users WHERE username = 'MYUSER'(用户名全大写) - 执行
ALTER USER MYUSER DEFAULT TABLESPACE my_ts,注意:这步不自动授配额 - 必须跟
ALTER USER MYUSER QUOTA UNLIMITED ON my_ts;若只给有限配额(如QUOTA 100M ON my_ts),用户写满后会报ORA-01536 - 切勿在PDB中执行
GRANT UNLIMITED TABLESPACE TO MYUSER——该权限是CDB级,PDB中执行会报ORA-01950
删除表空间前必须绕开的两个陷阱
DROP TABLESPACE在PDB中看似简单,但忽略依赖关系或容器上下文,极易导致PDB不可用或残留对象。
- 删除前务必检查是否有用户默认指向该表空间:
SELECT username FROM dba_users WHERE default_tablespace = 'MY_TS';若有,先ALTER USER ... DEFAULT TABLESPACE切走 - 确认无段(segment)残留:
SELECT segment_name FROM dba_segments WHERE tablespace_name = 'MY_TS';非空则需先DROP对应对象或用INCLUDING CONTENTS AND DATAFILES - 绝对不要在
CDB$ROOT下删PDB的表空间——语句会成功,但实际删的是CDB自己的同名表空间,PDB内对象变成“孤儿”,后续OPEN可能失败
CREATE、ALTER、DROP都严格绑定当前CON_NAME,且路径、权限、视图范围全部隔离。一次忘记ALTER SESSION,后面所有操作都跑偏。











