在Oracle数据库运维过程中,表空间使用率过高是常见的风险点,一旦表空间满溢会导致新数据无法写入,甚至引发业务故障。因此建立有效的表空间使用率监控机制十分必要。

通过系统视图手动查询使用率
Oracle提供了多个数据字典视图,可以直接查询表空间的使用情况,最常用的视图是DBA_DATA_FILES和DBA_FREE_SPACE,前者记录数据文件的总大小,后者记录剩余空闲空间。
我们可以通过关联这两个视图,计算出每个表空间的使用率,具体查询语句如下:
-- 查询所有表空间的使用率,包含总大小、已用大小、剩余大小和使用率
SELECT
a.tablespace_name AS 表空间名称,
ROUND(a.total_size / 1024 / 1024 / 1024, 2) AS 总大小_GB,
ROUND((a.total_size - b.free_size) / 1024 / 1024 / 1024, 2) AS 已用大小_GB,
ROUND(b.free_size / 1024 / 1024 / 1024, 2) AS 剩余大小_GB,
ROUND((a.total_size - b.free_size) / a.total_size * 100, 2) AS 使用率_百分比
FROM
(SELECT tablespace_name, SUM(bytes) AS total_size FROM DBA_DATA_FILES GROUP BY tablespace_name) a
LEFT JOIN
(SELECT tablespace_name, SUM(bytes) AS free_size FROM DBA_FREE_SPACE GROUP BY tablespace_name) b
ON a.tablespace_name = b.tablespace_name
ORDER BY 使用率_百分比 DESC;如果需要单独查询临时表空间的使用率,可以使用DBA_TEMP_FILES和DBA_TEMP_FREE_SPACE视图,查询逻辑和上述语句类似。
自动化监控脚本实现
手动查询适合临时排查问题,长期监控需要编写自动化脚本,定期执行查询并将结果输出或告警。以下是一个简单的Shell脚本示例,可以在Linux环境下运行,将使用率超过阈值的表空间信息输出到日志:
#!/bin/bash
# Oracle表空间监控脚本,阈值设置为90%
THRESHOLD=90
LOG_FILE="/var/log/oracle_tablespace_monitor.log"
ORACLE_SID="orcl"
ORACLE_HOME="/u01/app/oracle/product/19.3.0/dbhome_1"
PATH=$ORACLE_HOME/bin:$PATH
# 执行SQL查询,获取使用率超过阈值的表空间
RESULT=$(sqlplus -S "/ as sysdba" <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT tablespace_name || ' 使用率: ' || ROUND((total_size - free_size) / total_size * 100, 2) || '%'
FROM (
SELECT
a.tablespace_name,
a.total_size,
NVL(b.free_size, 0) AS free_size
FROM
(SELECT tablespace_name, SUM(bytes) AS total_size FROM DBA_DATA_FILES GROUP BY tablespace_name) a
LEFT JOIN
(SELECT tablespace_name, SUM(bytes) AS free_size FROM DBA_FREE_SPACE GROUP BY tablespace_name) b
ON a.tablespace_name = b.tablespace_name
)
WHERE ROUND((total_size - free_size) / total_size * 100, 2) >= $THRESHOLD;
EXIT;
EOF
)
# 如果有超过阈值的表空间,写入日志
if [ -n "$RESULT" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 表空间使用率告警:" >> $LOG_FILE
echo "$RESULT" >> $LOG_FILE
fi可以将该脚本添加到crontab定时任务中,比如每天凌晨2点执行一次,实现定期监控。
监控注意事项
- 注意区分数据表空间和临时表空间,两者的查询视图不同,不能混用
- 如果表空间开启了自动扩展,需要同时关注数据文件的最大扩展大小和当前使用率,避免扩展到上限后仍然满溢
- 对于业务核心表空间,建议将告警阈值设置得低一些,比如85%,预留足够的扩容时间
- 定期清理无用的历史数据,释放表空间,避免频繁扩容
通过上述方法,就可以实现对Oracle表空间使用率的有效监控,及时发现容量风险,保障数据库业务的正常运行。