DBA_TABLESPACE_USAGE_METRICS不能直接查出表空间使用率,因其依赖后台定时刷新且存在NULL、负值或估算偏差;真实使用率需在PDB内查询该视图或联查DBA_DATA_FILES与DBA_FREE_SPACE计算得出。

直接查 CDB_TABLESPACES 和 CDB_DATA_FILES 会漏掉 PDB 级实际使用量
很多人一上来就查 CDB_TABLESPACES,发现 USED_SPACE、FREE_SPACE 字段全是 NULL——这不是 bug,是设计如此。Oracle 23ai(以及 12c 起所有多租户版本)中,表空间使用率必须在 PDB 内部采集,CDB 层的视图只提供结构定义,不聚合使用数据。
真正有效的做法是:连接到目标 PDB,再查 DBA_TABLESPACE_USAGE_METRICS 或 DBA_TABLESPACE_USAGE(后者在 23ai 中已增强支持 PDB 上下文)。若用 CDB 视图统一监控,必须走 CDB_ 前缀 + CON_ID 关联,且需确保采集程序在每个 PDB 内执行过统计刷新(比如触发一次 DBMS_SPACE.ADMIN_TABLESPACE_USAGE)。
- 错误写法:
SELECT tablespace_name, used_space FROM CDB_TABLESPACES;→ 结果不可信 - 正确路径:先
ALTER SESSION SET CONTAINER = pdb1;,再SELECT tablespace_name, used_percent FROM DBA_TABLESPACE_USAGE_METRICS; - 自动化脚本里别硬编码 PDB 名,用
CDB_PDBS动态拼接连接串,避免漏采
CDB_TABLESPACE_USAGE_METRICS 是 23ai 新增的统一视图,但需注意 CON_ID 和刷新延迟
23ai 引入了 CDB_TABLESPACE_USAGE_METRICS,理论上可在 CDB root 一次性查所有 PDB 的表空间使用率。但它依赖后台定时任务(默认每 60 分钟刷新一次),且字段 USED_PERCENT 是估算值,不是实时 SUM(bytes) 计算结果。
更麻烦的是:该视图的 CON_ID 对应 PDB 的容器 ID,但如果你用 CDB_PDBS.NAME 关联,要注意 CON_ID 在 CDB 启动后可能重排(尤其发生 PDB unplug/plug 后),不能当成静态映射。
- 安全用法:
SELECT p.name, t.tablespace_name, t.used_percent FROM CDB_TABLESPACE_USAGE_METRICS t JOIN CDB_PDBS p ON t.con_id = p.con_id WHERE p.status = 'OPEN'; - 若需准实时数据,必须进 PDB 执行
EXEC DBMS_SPACE.OBJECT_SPACE_USAGE或调用DBMS_SPACE.SPACE_USAGE - 墨天轮智能巡检 v2.3 就是靠这个视图做 PDB 表空间渗透分析,但内部做了二次校验:对
used_percent > 95%的条目自动切到对应 PDB 再跑精确扫描
临时表空间和 UNDO 表空间要单独处理,DBA_TEMP_FREE_SPACE 不跨 PDB
PDB 的临时表空间(TEMP)使用率不会出现在 DBA_TABLESPACE_USAGE_METRICS 里。23ai 仍沿用老逻辑:每个 PDB 拥有独立的临时表空间,其空闲空间只能在该 PDB 内查 DBA_TEMP_FREE_SPACE。UNDO 表空间同理,PDB 共享 CDB 的 UNDO 表空间,但用量归属按事务回滚段划分,得看 CDB_UNDO_STATS(23ai 新增)或 V$UNDOSTAT 的 CON_ID 列。
- 查 PDB 临时使用:
SELECT tablespace_name, round((free_space/total_blocks)*100, 2) free_pct FROM DBA_TEMP_FREE_SPACE; - 查 UNDO 按 PDB 分摊:
SELECT con_id, sum(undoblks) * (SELECT block_size FROM v$tablespace WHERE name = 'UNDOTBS1') undo_bytes FROM CDB_UNDO_STATS GROUP BY con_id; - 别忘了:PDB 的默认临时表空间可被显式修改(
ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE temp2;),查之前先确认当前生效的是哪个
墨天轮 v2.3 已适配,但采集时容易因权限或状态失败
墨天轮智能巡检 v2.3 确实把 PDB 表空间使用率纳入了标准巡检项,但它依赖两个前提:一是采集账号在每个 PDB 中都具备 SELECT_CATALOG_ROLE(或显式授予 SELECT ON DBA_TABLESPACE_USAGE_METRICS),二是 PDB 必须处于 READ WRITE 或 READ ONLY 状态——MOUNTED 或 RESTRICTED 状态下无法采集。
常见失败现象:ORA-01219: database not open: queries allowed on fixed tables/views only,这说明采集程序试图连 PDB 但该 PDB 实际没 open;或者返回全零数据,大概率是权限不足导致视图为空。
- 快速验证权限:
CONNECT / AS SYSDBA; ALTER SESSION SET CONTAINER = pdb1; SELECT COUNT(*) FROM DBA_TABLESPACE_USAGE_METRICS;返回 >0 才算通 - Docker 场景下特别注意:Free 版默认 PDB 名是
FREEPDB1,不是FREE,连错容器名会导致始终查 CDB root - 23ai 中
DBA_TABLESPACE_USAGE_METRICS的USED_PERCENT可能显示负数(如 -1),表示统计未就绪,此时应等待下次自动刷新或手动触发


















