必须先切换到目标PDB容器再查表空间,因默认连接CDB$ROOT时dba_data_files仅显示CDB级文件;若在CDB中建表空间,PDB用户将因无权限而报ORA-01950;需确认PDB处于READ WRITE状态、路径隔离、禁用ALTER DATABASE DEFAULT TABLESPACE等CDB级命令。
查表空间前必须确认当前容器
直接连上 oracle 12c 默认进的是 cdb$root,dba_data_files 查出来的是 cdb 级别的文件,不是你业务 pdb 的。不切容器就建表空间,结果会建在 cdb 根里,后续用户建表会报 ora-01950: no privileges on tablespace —— 因为 pdb 用户默认没权限用 cdb 表空间。
先确认当前容器:show con_name;再查 PDB 列表:select name, open_mode from v$pdbs;确认目标 PDB 已处于 READ WRITE 状态。只有 open 的 PDB 才能操作其表空间。
- 切到目标 PDB:
alter session set container = orclpdb1 - 再查数据文件:
select tablespace_name, file_name from dba_data_files - 如果刚创建完 PDB 但没 open,
alter pluggable database orclpdb1 open再试
在 PDB 中创建永久表空间要指定完整路径
CDB 和 PDB 共享一套文件系统,但 Oracle 不允许 PDB 表空间文件和 CDB 文件混放(尤其不能放在 CDB 的 ORCL 目录下)。否则启动 PDB 时可能报 ORA-65043: invalid file name 或挂载失败。
路径必须指向该 PDB 对应的子目录,比如 CDB 数据目录是 /opt/oracle/oradata/ORCL/,那 PDB orclpdb1 的数据文件路径应为 /opt/oracle/oradata/ORCL/ORCLPDB1/ —— 注意末尾带 PDB 名,且该目录需提前 mkdir -p 并赋予 Oracle 用户读写权限。
- 正确示例:
create tablespace syz datafile '/opt/oracle/oradata/ORCL/ORCLPDB1/syz.dbf' size 1G autoextend on next 100M maxsize unlimited - 错误示例:
create tablespace syz datafile '/opt/oracle/oradata/ORCL/syz.dbf'(建在 CDB 目录下) - 别漏掉
autoextend on,否则表空间满后 DML 直接失败,没有提示
设 PDB 默认表空间不能用 ALTER DATABASE
ALTER DATABASE DEFAULT TABLESPACE 是 CDB 级命令,对 PDB 无效。在 PDB 里执行只会报 ORA-65040: operation not allowed from within a pluggable database。
必须用 ALTER PLUGGABLE DATABASE 命令,且只能在 CDB$ROOT 下执行(连接 sys / as sysdba 后切过去),或在该 PDB 内以本地 sys 用户执行:
- 在 CDB$ROOT 下设:
alter pluggable database orclpdb1 default tablespace syz - 在 PDB 内设(需已连入):
alter pluggable database default tablespace syz - 验证:
select property_value from database_properties where property_name = 'DEFAULT_TBS_TYPE'和select property_value from database_properties where property_name = 'DEFAULT_PERMANENT_TABLESPACE'
临时表空间和 UNDO 表空间不能在 PDB 单独建
PDB 没有独立的 UNDO 表空间,整个 CDB 只有一个 UNDO 表空间,由 CDB$ROOT 管理。试图在 PDB 里建 UNDO TABLESPACE 会报 ORA-65087: cannot create undo tablespace in a pluggable database。
临时表空间可以建,但必须显式声明 TEMPORARY TABLESPACE(不是 TABLESPACE),且设为默认时也得用 ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE。
- 建临时表空间:
create temporary tablespace temp_pdb1 tempfile '/opt/oracle/oradata/ORCL/ORCLPDB1/temp01.dbf' size 50M - 设默认:
alter pluggable database default temporary tablespace temp_pdb1 - 别混淆:PDB 的
temp表空间文件路径同样必须隔离,不能复用 CDB 的 temp01.dbf
真正容易被忽略的是:PDB 的临时表空间一旦设为默认,所有新用户都会自动分配它;但如果删掉这个表空间又没重设,默认会回退到 CDB 的 TEMP,而 PDB 用户未必有权限用——所以删之前务必先设好新默认。











