最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在Oracle 11g中查询表空间使用率
时间:2026-08-22 09:50:49 编辑:袖梨 来源:一聚教程网
应优先使用DBA_TABLESPACE_USAGE_METRICS视图获取表空间使用率,因其覆盖空表空间等边界情况、字段直观、无需拼接查询;临时表空间需用v$temp_space_header与dba_temp_files联查;还需检查autoextensible属性以防ORA-01653。
直接用 DBA_TABLESPACE_USAGE_METRICS 视图,这是 Oracle 11g 引入的最准、最简方式,不需要拼接子查询或担心空表空间被漏掉。
为什么不用 dba_free_space 和 dba_data_files 联查?
这类经典写法(比如 SELECT ... FROM dba_data_files, dba_free_space WHERE ...)在表空间刚创建但尚未分配任何段时会返回空行——也就是说,新表空间明明是“0% 使用”,却查不到。更麻烦的是,如果某个表空间下所有数据文件都 AUTOEXTENSIBLE = 'NO',而你又没及时监控,等真正报 ORA-01653 就晚了。
-
DBA_TABLESPACE_USAGE_METRICS是动态计算的,包含所有在线表空间,哪怕还没建任何对象 - 它底层已自动处理了空表空间、临时表空间、只读表空间等边界情况
- 字段直观:
USED_SPACE和TABLESPACE_SIZE单位都是bytes,直接算百分比即可
DBA_TABLESPACE_USAGE_METRICS 的实际用法
执行以下语句就能拿到全部表空间的实时使用率:
SELECT tablespace_name,ROUND(used_space * 100 / tablespace_size, 2) AS "USED_RATE(%)",ROUND(used_space / 1024 / 1024, 2) AS "USED_MB",ROUND(tablespace_size / 1024 / 1024, 2) AS "TOTAL_MB"FROM DBA_TABLESPACE_USAGE_METRICSORDER BY "USED_RATE(%)" DESC;
注意三点:
- 该视图只对 DBA 用户可见,普通用户需授权
SELECT_CATALOG_ROLE - 结果中不包含临时表空间(
TEMP),查临时表空间得换V$TEMP_SPACE_HEADER或DBA_TEMP_FILES - 数值是快照级,非实时秒级更新,但刷新频率足够用于日常巡检(通常每 15–30 分钟更新一次)
查临时表空间必须绕开 DBA_TABLESPACE_USAGE_METRICS
临时表空间的使用逻辑和永久表空间完全不同:它不靠 dba_free_space,而是由排序/哈希操作动态分配并释放,且释放有延迟。强行套用永久表空间查询会严重失真。
正确做法是组合两个视图:
SELECT tf.tablespace_name,ROUND(SUM(tf.bytes) / 1024 / 1024, 2) AS "TOTAL_MB",ROUND(SUM(tsh.bytes_used) / 1024 / 1024, 2) AS "USED_MB",ROUND((SUM(tsh.bytes_used) / SUM(tf.bytes)) * 100, 2) AS "USED_RATE(%)"FROM dba_temp_files tfJOIN v$temp_space_header tsh ON tf.tablespace_name = tsh.tablespace_nameGROUP BY tf.tablespace_name;
关键点:
-
v$temp_space_header中的bytes_used是当前正在被会话占用的量,不是历史峰值 - 如果某次大排序失败,这部分空间不会立刻归还,所以看到 95% 不代表马上要爆,但需结合
v$sort_usage查具体会话 -
dba_temp_files必须参与 JOIN,否则可能因多文件导致重复计数
真正容易被忽略的是:表空间使用率只是表象,autoextensible = 'NO' 的数据文件一旦填满,哪怕整体表空间才用 30%,也会直接触发 ORA-01653。查完使用率后,顺手跑一遍 SELECT file_name, autoextensible, maxbytes FROM dba_data_files 才算闭环。