Prometheus 监控 Oracle 全栈实战:从表空间到等待事件的终极可观测性
Oracle 数据库承载着金融、电信等关键业务,其表空间使用率、会话并发、等待事件、SGA 命中率等指标必须 7×24 可视化。Prometheus 生态借助oracledb_exporter将 Oracle 的V$动态性能视图转化为 Prometheus 指标,让 DBA 首次能像监控微服务一样监控 Oracle。本文将覆盖从 Exporter 部署到高级等待事件告警的全部细节,帮你实现 Oracle 的可观测性跨越。
1. 部署 oracledb_exporter
推荐使用prometheus-community/oracledb_exporter(基于 Go,支持 Oracle 11g/12c/19c/21c 及多租户)。
1.1 创建监控用户并授权
以 SYSDBA 身份登录 SQL*Plus,创建最小权限的监控账户:
CREATEUSERprometheus IDENTIFIEDBY"StrongPassword";GRANTCONNECT,CREATESESSIONTOprometheus;GRANTSELECTONV_$INSTANCETOprometheus;GRANTSELECTONV_$SYSSTATTOprometheus;GRANTSELECTONV_$SYSTEM_EVENTTOprometheus;GRANTSELECTONV_$SESSIONTOprometheus;GRANTSELECTONV_$WAITCLASSMETRICTOprometheus;GRANTSELECTONV_$PROCESSTOprometheus;GRANTSELECTONDBA_TABLESPACESTOprometheus;GRANTSELECTONDBA_DATA_FILESTOprometheus;GRANTSELECTONDBA_FREE_SPACETOprometheus;GRANTSELECTONV_$DATABASETOprometheus;GRANTSELECTONV_$ASM_DISKGROUPTOprometheus;-- 若使用 ASMGRANTSELECTONV_$ASM_DISKTOprometheus;-- 以下用于捕获 SQL 等待(如果启用扩展)GRANTSELECTONV_$SQLTOprometheus;GRANTSELECTONV_$SQLAREATOprometheus;如果 Oracle 版本支持,也可以直接授予SELECT_CATALOG_ROLE,但生产环境建议精细赋权。
1.2 安装 Oracle Instant Client
Exporter 依赖于 Oracle 客户端库。在监控主机(不必是数据库服务器)安装 Instant Client:
# 示例:Oracle Linux / CentOSsudoyuminstalloracle-instantclient19.18-basic-19.18.0.0.0-1.x86_64.rpmsudoldconfig或者下载 ZIP 包解压,设置环境变量:
exportLD_LIBRARY_PATH=/opt/oracle/instantclient_19_18:$LD_LIBRARY_PATH1.3 运行 exporter
二进制部署:
wgethttps://github.com/prometheus-community/oracledb_exporter/releases/download/v0.5.0/oracledb_exporter-0.5.0.linux-amd64.tar.gztarxzf oracledb_exporter-0.5.0.linux-amd64.tar.gzcdoracledb_exporter-0.5.0.linux-amd64通过环境变量传入连接串(支持完整的 Easy Connect 或 TNS 连接):
exportDATA_SOURCE_NAME="oracle://prometheus:StrongPassword@//db-host:1521/ORCLPDB1"./oracledb_exporter --web.listen-address=:9161Docker 部署(推荐,因为封装了客户端库):
dockerrun-d\--nameoracledb_exporter\-p9161:9161\-eDATA_SOURCE_NAME="oracle://prometheus:StrongPassword@//192.168.1.50:1521/ORCLPDB1"\iamseth/oracledb_exporter:latest访问http://<host>:9161/metrics,应看到大量oracledb_*指标。
2. 配置 Prometheus 抓取
scrape_configs:-job_name:'oracle'scrape_interval:30sstatic_configs:-targets:-'10.0.0.30:9161'labels:instance:'oracle-prod'db:'ORCL'重载 Prometheus 后即可查询。
3. 核心监控指标与 PromQL
| 分类 | 关键指标 | 含义 | PromQL 示例 |
|---|---|---|---|
| 实例存活 | oracledb_up | 1 = 可连接并查询 | 直接判断 |
| 会话数 | oracledb_sessions_total | 当前会话总数 | 结合sessions_limit计算使用率 |
| 活跃事务 | oracledb_transactions_active_total | 当前活跃事务数 | 告警阈值 |
| 等待事件 | oracledb_wait_time_seconds_total(按 event 标签) | 各类等待事件累计时间 | rate(oracledb_wait_time_seconds_total{event="db file scattered read"}[5m])看变化率 |
| CPU 使用 | oracledb_cpu_usage_percent | Oracle 内部计算的 CPU 利用率 | 直接看趋势 |
| 表空间使用率 | oracledb_tablespace_free_bytesoracledb_tablespace_size_bytes | 表空间空闲/总大小 | (1 - oracledb_tablespace_free_bytes / oracledb_tablespace_size_bytes) * 100 |
| SGA 命中率 | oracledb_sga_buffer_cache_hit_ratiooracledb_sga_library_cache_hit_ratio | 缓冲区缓存/库缓存命中率 | 直接查看百分比,越低越需要调整 |
| PGA 内存 | oracledb_pga_aggregate_target_bytes和oracledb_pga_total_allocated_bytes | PGA 使用情况 | oracledb_pga_total_allocated_bytes / oracledb_pga_aggregate_target_bytes |
| 重做日志 | oracledb_redo_log_switch_count | 日志切换次数 | rate(oracledb_redo_log_switch_count[5m]) |
| ASM 磁盘组 | oracledb_asm_diskgroup_free_mb/total_mb | ASM 使用率 | 类似表空间公式 |
不同版本 exporter 指标名可能稍有差异,最新版大多带oracledb_前缀。利用 Grafana Explore 直接查看oracledb_开头的指标可快速熟悉。
等待事件分析是 Oracle 监控的黄金指标,重点关注:
db file sequential read(索引读延迟)db file scattered read(全表扫描)log file sync(提交延迟)enq: TX - row lock contention(行锁争用)
4. Grafana 仪表盘推荐
- Oracle Database Overview:Dashboard ID3333(最经典,适合 12c/19c)
涵盖会话、等待、表空间、SGA、PGA、IO、RAC 等。 - Oracle DB Exporter (Prometheus):ID14500,更现代,适配新版本 exporter。
- Oracle ASM:ID4546(若使用 ASM)。
导入后修改变量instance指向你的 Oracle target。
5. 告警规则实战
groups:-name:oracle_alertsrules:-alert:OracleInstanceDownexpr:oracledb_up == 0for:1mlabels:severity:criticalannotations:summary:"Oracle 实例 {{ $labels.instance }} 不可用"-alert:OracleTablespaceFullexpr:(1-oracledb_tablespace_free_bytes / oracledb_tablespace_size_bytes) * 100>90for:5mlabels:severity:criticalannotations:summary:"表空间 {{ $labels.tablespace }} 使用率超过 90%"-alert:OracleHighSessionUsageexpr:oracledb_sessions_total / oracledb_sessions_limit>0.8for:5mlabels:severity:warningannotations:summary:"会话数使用率超过 80%"-alert:OracleDeadlockexpr:rate(oracledb_deadlocks_total[5m])>0labels:severity:criticalannotations:summary:"检测到死锁"-alert:OracleWaitEventSpikeexpr:rate(oracledb_wait_time_seconds_total{event="log file sync"}[5m])>0.2for:10mlabels:severity:warningannotations:summary:"log file sync 等待时间 > 0.2 s/s,提交可能变慢"-alert:OracleBufferCacheHitRatioLowexpr:oracledb_sga_buffer_cache_hit_ratio < 0.95for:10mlabels:severity:warningannotations:summary:"Buffer Cache 命中率低于 95%"根据实际数据库负载调整阈值。
6. 进阶:多租户、RAC 和自定义指标
6.1 监控容器数据库 (CDB/PDB)
oracledb_exporter 默认连接到一个 PDB 或 CDB。若要集中监控多个 PDB,可以在连接串中指定每个 PDB 的 service name,并运行多个 exporter 实例,或使用--custom.metrics参数执行跨 PDB 查询。
6.2 Oracle RAC 环境
每个 RAC 节点有独立的实例,需要为每个节点启动一个 exporter,在 Prometheus 中标记不同的instance标签。集群层面的指标(如全局缓存融合)需自行编写查询并在 exporter 中注入。
6.3 自定义业务 SQL 监控
利用 exporter 的--custom.metrics参数,加载一个 TOML 配置文件来执行自定义 SQL 并将结果作为指标暴露。例如:
custom_metrics.toml:
[[metric]] context = "big_transactions" request = "big_transactions" metrics = [ { metric_name = "big_transactions_count", metric_type = "gauge", value_column = "cnt" } ] queries = [ { name = "big_transactions", sql = "SELECT count(*) cnt FROM v$transaction WHERE used_ublk > 10000" } ]启动时添加--custom.metrics=custom_metrics.toml。
7. 性能与安全
- 抓取开销:默认 30~60 秒抓取一次对 Oracle 压力很小,但若启用大量自定义查询,需评估 SQL 执行成本。
- 最小权限:严格遵循上述授权,绝不使用 DBA 角色。
- 网络加密:在
DATA_SOURCE_NAME中启用 Oracle Native Network Encryption 或 TLS(如?ssl_server_dn_match=false等参数)。 - Exporter 安全:监听端口限定在内网,用防火墙保护,必要时通过反向代理加 BasicAuth。
通过这套方案,Oracle 的“黑盒”被彻底打开:表空间即将满、会话拥堵、某类等待事件飙升……所有异常都会第一时间变成 Prometheus 告警,配合 Grafana 历史趋势,让 DBA 从被动救火转向主动预防。你的整个数据库监控体系也因此与服务器、应用监控无缝统一,真正实现全栈可观测。