一、基于 SQL 查询的手动监控
1. 查看表空间总体使用率
SELECT
t.tablespace_name,
t.status,
ROUND(SUM(d.bytes)/1024/1024, 2) AS "总大小(MB)",
ROUND(SUM(f.bytes)/1024/1024, 2) AS "空闲(MB)",
ROUND((1 - SUM(f.bytes)/SUM(d.bytes))*100, 2) AS "使用率(%)"
FROM
dba_tablespaces t,
dba_data_files d,
dba_free_space f
WHERE
t.tablespace_name = d.tablespace_name
AND t.tablespace_name = f.tablespace_name
GROUP BY
t.tablespace_name, t.status;
重点关注使用率接近 85% 的表空间2. 临时表空间使用情况
SELECT
tablespace_name,
ROUND(SUM(bytes_used)/1024/1024, 2) AS "已用(MB)",
ROUND(SUM(bytes_free)/1024/1024, 2) AS "空闲(MB)"
FROM
v$temp_space_header
GROUP BY
tablespace_name;
适用场景:排序操作频繁的系统(如数据仓库)3. 最大连续空闲块
SELECT
tablespace_name,
ROUND(MAX(bytes)/1024/1024, 2) AS "最大空闲块(MB)",
COUNT(*) AS "空闲块数量"
FROM
dba_free_space
GROUP BY
tablespace_name;
意义:评估空间碎片化程度,避免因碎片化导致的大对象分配失败二、自动化监控脚本
1. Shell 脚本定时检查
#!/bin/bash
# 表空间监控脚本 - 当使用率超过阈值时发送邮件
THRESHOLD=85 # 阈值百分比
LOG_FILE="/tmp/tablespace_monitor.log"
MAIL_RECIPIENT="dba@example.com"
# 查询表空间使用率
SQL_RESULT=$(sqlplus -S / as sysdba <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT
tablespace_name || ',' ||
ROUND((1 - SUM(f.bytes)/SUM(d.bytes))*100, 2)
FROM
dba_tablespaces t, dba_data_files d, dba_free_space f
WHERE
t.tablespace_name = d.tablespace_name
AND t.tablespace_name = f.tablespace_name
GROUP BY
tablespace_name;
EXIT;
EOF
)
# 检查是否有表空间超过阈值
echo "检查时间: $(date)" > $LOG_FILE
echo "------------------------" >> $LOG_FILE
ALERT=false
while IFS=',' read -r ts_name pct_used; do
if (( $(echo "$pct_used > $THRESHOLD" | bc -l) )); then
echo "警告: 表空间 $ts_name 使用率为 $pct_used%,超过阈值 $THRESHOLD%" >> $LOG_FILE
ALERT=true
else
echo "表空间 $ts_name 使用率: $pct_used%" >> $LOG_FILE
fi
done <<< "$SQL_RESULT"
# 发送邮件告警
if [ "$ALERT" = true ]; then
mailx -s "Oracle表空间告警" $MAIL_RECIPIENT < $LOG_FILE
fi
建议添加定时任务:添加到 crontab 每小时执行一次2. Python 脚本生成报表
import cx_Oracle
import pandas as pd
from datetime import datetime
# 数据库连接信息
conn = cx_Oracle.connect("system/password@localhost:1521/orcl")
# 查询表空间信息
query = """
SELECT
t.tablespace_name,
ROUND(SUM(d.bytes)/1024/1024, 2) AS total_mb,
ROUND(SUM(f.bytes)/1024/1024, 2) AS free_mb,
ROUND((1 - SUM(f.bytes)/SUM(d.bytes))*100, 2) AS pct_used
FROM
dba_tablespaces t, dba_data_files d, dba_free_space f
WHERE
t.tablespace_name = d.tablespace_name
AND t.tablespace_name = f.tablespace_name
GROUP BY
t.tablespace_name
ORDER BY
pct_used DESC
"""
# 执行查询并生成报表
df = pd.read_sql(query, conn)
timestamp = datetime.now().strftime("%Y%m%d_%H%M")
report_file = f"tablespace_report_{timestamp}.csv"
df.to_csv(report_file, index=False)
print(f"报表已生成: {report_file}")
conn.close()三、Oracle 企业管理器(OEM)监控
1. 表空间使用趋势图
通过 OEM 控制台查看表空间历史使用趋势,预测增长情况:
登录 OEM
导航至 Targets > Database > [Your DB] > Storage > Tablespaces
查看使用率图表及预测分析
2. 设置自动告警
在 OEM 中配置阈值告警:
导航至 Setup > Alert > Metric Thresholds
为表空间使用率添加阈值规则(如超过 80% 告警)
配置通知方式(邮件 / SMS)
四、ASH/AWR 报告分析
1. 生成 AWR 报告
-- 使用SQL生成AWR报告
@?/rdbms/admin/awrrpt.sql2. ASH 分析临时表空间争用
-- 查询高负载时段的临时表空间使用
SELECT
sample_time,
sql_id,
session_id,
event,
p1text,
p1, -- 等待资源ID(临时段)
p2text,
p2 -- 等待块号
FROM
v$active_session_history
WHERE
event LIKE '%temp%'
AND sample_time > SYSDATE - 1/24 -- 最近1小时
ORDER BY
sample_time DESC;五、第三方监控工具
1.Quest Spotlight on Oracle
实时监控表空间使用
自动发现空间增长异常
提供容量规划预测
2.Dell Toad for Oracle
直观的表空间可视化界面
一键生成空间分析报告
支持空间使用率阈值告警
3.Grafana + Prometheus
通过 Oracle Exporter 采集指标
自定义仪表盘展示空间趋势
集成告警管理器(Alertmanager)
详情安装即介绍可以查看此链接
彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统-腾讯云开发者社区-腾讯云
定期备份与清理
每周执行表空间使用率全量检查
清理无用数据(归档日志、历史数据)
对大表执行
ALTER TABLE ... SHRINK SPACE
预防性扩容
当表空间使用率达到 75% 时,计划扩容
预留至少 30% 的可用空间应对突发增长
临时表空间优化
对大查询添加
/*+ USE_NL(a b) */提示避免排序为高负载用户分配专用临时表空间
定期重建临时表空间减少碎片
自动化监控
部署监控脚本实现 7×24 小时自动检测
集成到企业监控平台(如 Zabbix、Nagios)