pdb_storage_limits仅显示显式设置的表空间硬性上限,未设置时无记录或storage_unlimited='yes'且max_size为null;须在cdb$root中查cdb_pdb_storage_limits,结合cdb_data_files等视图监控实际使用率。
直接查 pdb_storage_limits 就能拿到每个 pdb 的表空间配额,但必须注意:它只反映显式设置的限额(storage_unlimited = 'no' 时才有效),不等于实际已用或剩余空间。
为什么 PDB_STORAGE_LIMITS 返回空或全是 NULL?
这个视图只记录你主动用 ALTER PLUGGABLE DATABASE ... STORAGE (MAXSIZE ...) 设置过的硬性上限。默认情况下,PDB 继承 CDB 级别的资源管理策略,没设过就不会出现在该视图里。
- 如果没执行过类似
ALTER PLUGGABLE DATABASE pdb1 STORAGE (MAXSIZE 10G),PDB_STORAGE_LIMITS就查不到对应行 -
STORAGE_UNLIMITED = 'YES'表示没设上限,此时MAX_SIZE列为NULL,不是“0” - 该视图在 CDB$ROOT 中查询,不能在 PDB 内直接查
PDB_STORAGE_LIMITS 和 CDB_DATA_FILES 的关系
两者完全不重叠:PDB_STORAGE_LIMITS 是策略配置项,CDB_DATA_FILES 是物理文件清单。一个管“允许用多少”,一个管“当前有哪些文件”。别指望从 PDB_STORAGE_LIMITS 算出已用空间。
- 查限额用
SELECT * FROM CDB_PDB_STORAGE_LIMITS(注意是CDB_前缀) - 查实际数据文件大小得结合
CDB_DATA_FILES和CDB_FREE_SPACE - 临时表空间限额不走这个视图,得看
CDB_TEMP_FILES的AUTOEXTENSIBLE和MAXBYTES
查 PDB 表空间使用率,不能只靠 PDB_STORAGE_LIMITS
它解决不了“还剩多少空间可用”这个问题。真正要监控使用率,必须联合多个容器视图,并区分永久/临时表空间:
- 永久表空间:用
CDB_DATA_FILES算总大小,CDB_FREE_SPACE算空闲块,再按CON_ID关联V$PDBS显示库名 - 临时表空间:
CDB_TEMP_FILES提供文件大小,V$TEMP_SPACE_HEADER提供已用/空闲字节数,二者CON_ID必须对齐 - 常见漏点:忘记加
WHERE CON_ID = SYS_CONTEXT('USERENV', 'CON_ID')过滤当前 PDB,结果混了所有容器
最易被忽略的是:即使你给 PDB 设了 STORAGE MAXSIZE 5G,只要底层数据文件还没撑满,DBA_FREE_SPACE 仍可能返回大量空闲块——限额是逻辑控制,不是物理隔离。真要防爆库,得配合资源计划(CREATE CDB RESOURCE PLAN)做运行时限制。











