一、基于 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 控制台查看表空间历史使用趋势,预测增长情况:

  1. 登录 OEM

  2. 导航至 Targets > Database > [Your DB] > Storage > Tablespaces

  3. 查看使用率图表及预测分析

2. 设置自动告警

在 OEM 中配置阈值告警:

  1. 导航至 Setup > Alert > Metric Thresholds

  2. 为表空间使用率添加阈值规则(如超过 80% 告警)

  3. 配置通知方式(邮件 / SMS)

四、ASH/AWR 报告分析

1. 生成 AWR 报告

-- 使用SQL生成AWR报告
@?/rdbms/admin/awrrpt.sql

2. 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搭建完整的应用监控系统-腾讯云开发者社区-腾讯云

  1. 定期备份与清理

    • 每周执行表空间使用率全量检查

    • 清理无用数据(归档日志、历史数据)

    • 对大表执行ALTER TABLE ... SHRINK SPACE

  2. 预防性扩容

    • 当表空间使用率达到 75% 时,计划扩容

    • 预留至少 30% 的可用空间应对突发增长

  3. 临时表空间优化

    • 对大查询添加/*+ USE_NL(a b) */提示避免排序

    • 为高负载用户分配专用临时表空间

    • 定期重建临时表空间减少碎片

  4. 自动化监控

    • 部署监控脚本实现 7×24 小时自动检测

    • 集成到企业监控平台(如 Zabbix、Nagios)