PDB空间不足需先区分物理磁盘满还是逻辑表空间满:用df -h查宿主机磁盘,再查dba_tablespace_usage_metrics确认PDB内逻辑使用率,扩容操作必须在对应PDB内执行,且优先启用AUTOEXTEND或清理回收站与大对象。
直接结论:PDB数据文件空间不足,不能只盯着ALTER DATABASE DATAFILE ... RESIZE硬扩,必须先确认是“物理空间耗尽”还是“逻辑空间用满”,两者的处理路径完全不同。
很多人一看到“空间不足”就冲去扩容数据文件,结果发现ORA-01144(文件大小超出最大值)或ORA-01237(无法扩展数据文件),其实是底层文件系统已满。先分清问题层级:
df -h 查宿主机磁盘,重点看数据文件所在路径(如 /home/oracle/app/oracle/oradata/andycdb/pdb01/)是否 Use% ≥95%ALTER DATABASE DATAFILE ... RESIZE 会直接报 ORA-27057 或 ORA-09817(写审计文件失败),此时扩容毫无意义SELECT tablespace_name, used_mb, max_mb FROM dba_tablespace_usage_metrics;
dba_tablespace_usage_metrics 是12c+的高效视图,比查 dba_free_space 快得多(后者在回收站积压时可能卡几十秒)确认是PDB表空间逻辑满后,操作必须在对应PDB内完成,不能在CDB$ROOT里执行——否则会改错容器:
ALTER SESSION SET CONTAINER = pdb01;
SELECT file_name, bytes/1024/1024 mb, autoextensible, maxbytes/1024/1024 max_mb FROM dba_data_files WHERE tablespace_name = 'BBB';
ALTER DATABASE DATAFILE '/home/oracle/app/oracle/oradata/andycdb/pdb01/bbb.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
ALTER DATABASE DATAFILE '/home/oracle/app/oracle/oradata/andycdb/pdb01/bbb.dbf' RESIZE 500M;
扩容不是唯一解,尤其当业务不允许停机或磁盘确实紧张时,清理比扩容更快:
SHOW CON_NAME 确认在目标PDB后,执行 SELECT COUNT(*) FROM RECYCLEBIN; —— 若数量 >1000,PURGE RECYCLEBIN; 能立刻释放大量空间SELECT owner, segment_name, bytes/1024/1024 mb FROM dba_segments WHERE tablespace_name = 'BBB' ORDER BY bytes DESC FETCH FIRST 5 ROWS ONLY;
TRUNCATE TABLE xxx DROP STORAGE;(比DELETE快,且立即释放空间)PURGE DBA_RECYCLEBIN,这是CDB级命令,需SYSDBA在CDB$ROOT下运行,否则报 ORA-65047
事后补救不如事前设防。PDB空间监控容易被忽略,因为默认告警只覆盖CDB级别:
DBMS_SPACE_ADMIN.TABLESPACE_WARN_THRESHOLD_SET('BBB', 85, 95); —— 达85%发预警,95%发严重告警ALTER TABLE xxx MOVE TABLESPACE bbb; 重排PDB_FILE_NAME_CONVERT 参数隔离,避免一个PDB撑爆整个CDB磁盘真正麻烦的从来不是扩容操作本身,而是误判问题层级——把磁盘满当成表空间满,或者在CDB里操作PDB文件,这类错误在紧急时刻高频发生,且恢复时间远超预期。