必须在目标pdb内创建专用临时表空间并设为默认,不可复用cdb$root或pdb$seed的temp;先执行alter session set container = plug4app;,再create temporary tablespace temp_plug4app tempfile '/u01/oradata/cdb1/plug4app/temp01.dbf' size 100m autoextend on next 50m maxsize 2g;,最后alter database default temporary tablespace temp_plug4app;。

确认当前容器是目标PDB而非CDB$ROOT
临时表空间必须在目标PDB内部创建并设为默认,不能在CDB$ROOT中操作。如果当前CON_NAME显示CDB$ROOT或其它PDB名,先切过去:ALTER SESSION SET CONTAINER = PLUG4APP;(把PLUG4APP换成你的PDB名)。执行SHOW CON_NAME;确认返回值是你想配置的PDB名,否则后续CREATE TEMPORARY TABLESPACE会报ORA-65040。
在PDB内显式创建专用临时表空间
Oracle 19c不自动为新建PDB分配独立临时表空间——它默认继承PDB$SEED的TEMP,但该表空间物理文件仍共享种子库路径,违反租户隔离原则。必须手动建新临时表空间:
- 路径需独立:避免复用
/u01/oradata/cdb1/pdbseed/下的文件,改用PDB专属目录,如/u01/oradata/cdb1/plug4app/temp01.dbf - 大小与扩展策略按业务预估:OLTP类PDB建议起始100MB,
AUTOEXTEND ON NEXT 50M MAXSIZE 2G;报表类可设更大初始值 - 不指定
EXTENT MANAGEMENT或SEGMENT SPACE MANAGEMENT——临时表空间不支持这些参数,加了会报ORA-02187
示例命令:CREATE TEMPORARY TABLESPACE temp_plug4app TEMPFILE '/u01/oradata/cdb1/plug4app/temp01.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;
将新临时表空间设为PDB默认,并验证生效
创建完只是“存在”,不是“默认”。必须显式执行:ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_plug4app;。注意这不是ALTER SYSTEM,也不是在用户级操作,必须以SYS或具有ALTER DATABASE权限的用户在PDB内执行。
验证是否成功:
- 查当前默认:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';—— 应返回temp_plug4app - 查用户实际使用情况:
SELECT username, temporary_tablespace FROM dba_users WHERE username = 'APP4APP';—— 若用户未显式指定TEMPORARY TABLESPACE,就依赖此默认值 - 别漏掉已存在用户:已有用户不会自动切换,默认仍是旧
TEMP,需逐个执行ALTER USER app_user TEMPORARY TABLESPACE temp_plug4app;
为什么不能复用CDB$ROOT或PDB$SEED的TEMP表空间
复用意味着多个PDB共用同一组临时文件,会引发三类实际问题:
- I/O争用:排序、哈希连接等大量临时段操作集中在同一磁盘路径,尤其当多个PDB并发跑报表时,
temp文件成为性能瓶颈 - 故障扩散:一个PDB因
temp文件损坏导致ORA-01157,可能使整个CDB中所有依赖该临时文件的PDB无法执行排序操作 - 审计与配额失控:无法对单个PDB的临时段使用量做独立监控或限制(
DBA_TEMP_FREE_SPACE视图按PDB分隔,但底层文件混用会导致统计失真)
真正隔离的起点,就是每个PDB拥有自己的TEMP文件路径和表空间名——哪怕表空间名都叫TEMP,只要数据文件路径不同,就满足物理隔离要求。











