温馨提示×

如何监控Debian上的Oracle性能

小樊
38
2025-12-26 23:54:27
栏目: 云计算

监控体系与工具选型

  • 建议从四个层面建立可观测性:
    1. 监听器层:确认监听进程与端口(默认1521)可达、服务注册正常、日志无异常;
    2. 实例与数据库层:会话与SQL、等待事件、表空间、归档/Data Guard 延迟、AWR/ASH 基线;
    3. 操作系统层:CPU、内存、I/O、网络、进程资源(如 ora_pmon、ora_smon 等);
    4. 告警与可视化:集中展示与阈值告警(如 Zabbix、Prometheus + oracledb_exporter、Nagios、OEM)。
  • 工具建议:优先使用 Oracle Enterprise Manager(OEM) 做集中监控与告警;无 OEM 时,用 AWR/ASH 报告定位瓶颈,配合 oratop 实时查看会话、SQL 与等待事件;需要脚本化时可结合 SQL Developer/ToadPython cx_Oracle 拉取指标。系统层使用 top/htop、vmstat、iostat、sar、nmon、dstat、netstat 观察资源与连接数。

数据库层关键SQL与检查

  • 活跃会话与正在执行的 SQL(定位阻塞与高耗 SQL)
SELECT s.inst_id||':'||s.sid AS inst_sid,
       s.username,
       (SYSDATE - s.sql_exec_start) DAY TO SECOND AS exec_dur,
       s.sql_id,
       SUBSTR(q.sql_text,1,60) AS sql_text,
       CASE WHEN s.wait_time_micro = 0 THEN
              CASE s.wait_class WHEN 'Idle' THEN 'IDLE: '||s.event ELSE s.event END
            ELSE 'ON CPU' END AS state,
       ROUND(CASE WHEN s.wait_time_micro = 0 THEN s.time_since_last_wait_micro
                 ELSE s.wait_time_micro END / 1e6, 2) AS wait_sec
FROM gv$session s
LEFT JOIN gv$sql q ON q.sql_id = s.sql_id AND q.inst_id = s.inst_id
WHERE s.status = 'ACTIVE'
  AND s.username IS NOT NULL
ORDER BY wait_sec DESC NULLS LAST
FETCH FIRST 20 ROWS ONLY;
  • 长时运行 SQL TopN(按累计耗时)
SELECT sql_id, sql_text,
       ROUND(elapsed_time/1e6, 2) AS elapsed_sec,
       executions
FROM v$sql
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
  • 表空间使用率(超过 80% 建议扩容或清理)
SELECT a.tablespace_name,
       ROUND(a.bytes/1024/1024, 2) AS total_mb,
       ROUND((a.bytes - b.bytes)/1024/1024, 2) AS used_mb,
       ROUND((a.bytes - b.bytes)/a.bytes*100, 2) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes) AS bytes
      FROM dba_data_files GROUP BY tablespace_name) a,
     (SELECT tablespace_name, SUM(bytes) AS bytes
      FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY used_pct DESC;
  • AWR/ASH 快照与报告(周期性采集,对比分析性能趋势与等待事件)
-- 查看快照范围
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot ORDER BY snap_id DESC;

-- 生成AWR报告(在SQL*Plus中执行,按提示选择开始/结束快照ID)
@?/rdbms/admin/awrrpt.sql
  • Data Guard 备库延迟(ADG):获取最近已应用的归档时间并与当前时间比较,超过阈值(如1小时/3小时)触发告警。

系统层与监听器的监控

  • 资源与 I/O(建议持续采样并落库或推送至时序库)
    • 进程与 CPU/内存:top/htop
    • 虚拟内存、CPU、I/O:vmstat 1
    • 磁盘 I/O 与 await、svctm:iostat -x 1
    • 系统活动历史/实时:sar 1
    • 综合资源监控:nmon
    • 多合一资源视图:dstat
    • 内存/磁盘:free -h、df -h
    • 监听端口连通性:netstat -tlnp | grep 1521
  • 监听器(lsnrctl)
    • 查看状态:lsnrctl status
    • 实时日志:tail -f $ORACLE_HOME/network/log/listener.log
    • 重载配置:lsnrctl reload
    • 开启/关闭跟踪:lsnrctl trace start/stop
  • 要点:lsnrctl 用于监听器的管理与状态查看,并非系统性能监控工具;系统层应配合 top/vmstat/iostat 等使用。

自动化与告警落地

  • 开源监控平台
    • Prometheus + Grafana:部署 oracledb_exporter 采集 Oracle 指标,Grafana 做可视化看板,Prometheus 配置告警规则(如长事务、会话突增、表空间阈值)。
    • Zabbix:通过 ODBC 或外部脚本采集数据库与表空间等指标,配置触发器与通知媒介(邮件/企业微信/钉钉)。
    • Nagios:使用插件或脚本检查 ORA- 错误、会话数、表空间、备份状态等,形成服务健康检查与告警闭环。
  • 轻量脚本示例(表空间阈值告警,可接入 Zabbix/Nagios)
#!/usr/bin/env bash
ORACLE_SID=your_sid
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID ORACLE_HOME PATH

THRESHOLD=80
ALERT_EMAIL=dba@example.com

sqlplus -S / as sysdba <<'EOF'
SET HEADING OFF FEEDBACK OFF
SELECT tablespace_name || ':' || ROUND(used_pct, 1)
FROM (
  SELECT a.tablespace_name,
         ROUND((a.bytes - b.bytes)/a.bytes*100, 1) AS used_pct
  FROM (SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_data_files GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_free_space GROUP BY tablespace_name) b
  WHERE a.tablespace_name = b.tablespace_name
)
WHERE used_pct > $THRESHOLD
/
EXIT
EOF
  • 建议:将脚本输出接入 Zabbix Agent 的 UserParameterNagios 插件,并设置告警升级与值班通知。

日常巡检清单与阈值建议

  • 表空间:使用率超过 80% 预警,超过 90% 尽快扩容或清理。
  • 活跃会话:会话数、阻塞突增或长期阻塞需排查 Top SQL 与锁等待。
  • 长时 SQL:Elapsed Time、Executions 异常结合 AWR/ASH 优化执行计划与索引。
  • 等待事件:关注 db file sequential/scattered read、log file sync 等。
  • 监听器:使用 lsnrctl status 观察服务注册与连接数。
  • 系统资源:CPU 持续 > 80%I/O await 高、内存紧张时联动排查。
  • Data Guard:备库 LAST_APPLIED_TIME 落后超过阈值(如 1–3 小时)告警。
  • 日志:Alert/Listener 日志出现 ORA-TNS 错误、频繁重连及时告警。

0