Skip to content

Oracle Zabbix监控

概述

Zabbix是一款功能强大的开源监控系统,广泛应用于各种IT基础设施的监控。通过Zabbix监控Oracle数据库,可以实现对数据库性能、可用性和资源使用情况的全面监控,并在出现问题时及时发出告警。

Zabbix监控Oracle数据库的核心组件包括:Zabbix Server、Zabbix Agent(或Zabbix Sender)、Oracle监控模板和自定义脚本。

监控架构设计

架构组件

  1. Oracle数据库:监控目标,提供动态性能视图和系统视图
  2. Zabbix Agent:安装在数据库服务器上,执行监控脚本并将数据发送到Zabbix Server
  3. Zabbix Server:负责数据存储、处理和告警
  4. Zabbix Web界面:提供可视化监控界面和配置管理
  5. 监控模板:预定义的监控项、触发器和图形
  6. 自定义脚本:用于采集Oracle特定指标的脚本

架构图

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Oracle 19c/21c │◀────│ Zabbix Agent    │────▶│ Zabbix Server   │
│                 │     │ + 监控脚本      │     │                 │
└─────────────────┘     └─────────────────┘     │                 │
                                                │                 │
                                                └─────────────────┘


                                                ┌─────────────────┐
                                                │ Zabbix Web UI   │
                                                │                 │
                                                └─────────────────┘

数据流向

  1. Zabbix Server通过Zabbix Agent向数据库服务器发送监控请求
  2. Zabbix Agent执行预定义的监控脚本或命令
  3. 监控脚本连接Oracle数据库,查询动态性能视图获取指标
  4. Zabbix Agent将采集到的指标发送回Zabbix Server
  5. Zabbix Server存储指标数据,并根据触发器规则判断是否触发告警
  6. 如果触发告警,Zabbix Server通过配置的通知方式发送告警信息
  7. 用户通过Zabbix Web界面查看监控数据和告警信息

部署配置

1. 环境准备

1.1 安装Zabbix Server

根据操作系统选择合适的安装方式,参考Zabbix官方文档:

1.2 安装Zabbix Agent

在Oracle数据库服务器上安装Zabbix Agent:

bash
# CentOS/RHEL
yum install -y zabbix-agent

# Ubuntu/Debian
apt-get install -y zabbix-agent

1.3 配置Zabbix Agent

编辑Zabbix Agent配置文件 /etc/zabbix/zabbix_agentd.conf

ini
# Zabbix Server地址
Server=zabbix_server_ip
ServerActive=zabbix_server_ip

# 主机名(必须与Zabbix Web中配置的主机名一致)
Hostname=oracle_server_hostname

# 允许执行远程命令
EnableRemoteCommands=1

# 日志设置
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0

# 自定义脚本路径
Include=/etc/zabbix/zabbix_agentd.d/

重启Zabbix Agent服务:

bash
systemctl restart zabbix-agent
systemctl enable zabbix-agent

2. 配置Oracle监控用户

创建一个用于监控的Oracle用户,并授予必要的权限:

sql
-- 创建监控用户
CREATE USER zabbix_monitor IDENTIFIED BY password;

-- 授予必要的权限
GRANT CONNECT, CREATE SESSION TO zabbix_monitor;
GRANT SELECT ON V_$INSTANCE TO zabbix_monitor;
GRANT SELECT ON V_$SESSION TO zabbix_monitor;
GRANT SELECT ON V_$SYSSTAT TO zabbix_monitor;
GRANT SELECT ON V_$FILESTAT TO zabbix_monitor;
GRANT SELECT ON V_$TABLESPACE TO zabbix_monitor;
GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO zabbix_monitor;
GRANT SELECT ON V_$LIBRARYCACHE TO zabbix_monitor;
GRANT SELECT ON V_$SGASTAT TO zabbix_monitor;
GRANT SELECT ON V_$PGASTAT TO zabbix_monitor;
GRANT SELECT ON V_$SQLAREA TO zabbix_monitor;
GRANT SELECT ON V_$WAITSTAT TO zabbix_monitor;
GRANT SELECT ON V_$LOCK TO zabbix_monitor;

3. 配置监控脚本

创建Oracle监控脚本,用于采集数据库指标:

3.1 创建TNS配置文件

bash
cat > /etc/zabbix/oracle/tnsnames.ora << EOF
ORCL = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = 
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
EOF

3.2 创建监控脚本

创建主监控脚本 /etc/zabbix/scripts/oracle_monitor.sh

bash
#!/bin/bash

# Oracle监控脚本

# 环境变量设置
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=orcl
export TNS_ADMIN=/etc/zabbix/oracle
export PATH=$ORACLE_HOME/bin:$PATH

# 监控用户名和密码
USERNAME=zabbix_monitor
PASSWORD=password

# SQL查询函数
exec_sql() {
    local sql="$1"
    sqlplus -S $USERNAME/$PASSWORD << EOF
    SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF;
    $sql;
    EXIT;
EOF
}

# 根据参数执行不同的监控项
case $1 in
    instance_status)
        exec_sql "SELECT STATUS FROM V_$INSTANCE;"
        ;;
    active_sessions)
        exec_sql "SELECT COUNT(*) FROM V_$SESSION WHERE STATUS = 'ACTIVE';"
        ;;
    inactive_sessions)
        exec_sql "SELECT COUNT(*) FROM V_$SESSION WHERE STATUS = 'INACTIVE';"
        ;;
    cpu_usage)
        exec_sql "SELECT VALUE FROM V_$SYSSTAT WHERE NAME = 'CPU used by this session';"
        ;;
    memory_sga)
        exec_sql "SELECT SUM(VALUE) FROM V_$SGASTAT;"
        ;;
    memory_pga)
        exec_sql "SELECT VALUE FROM V_$PGASTAT WHERE NAME = 'total PGA allocated';"
        ;;
    tablespace_usage)
        exec_sql "SELECT TABLESPACE_NAME, USED_PERCENT FROM DBA_TABLESPACE_USAGE_METRICS;"
        ;;
    io_read_bytes)
        exec_sql "SELECT SUM(PHYBLKREAD) * 8192 FROM V_$FILESTAT;"
        ;;
    io_write_bytes)
        exec_sql "SELECT SUM(PHYBLKWRITE) * 8192 FROM V_$FILESTAT;"
        ;;
    sql_execute_time)
        exec_sql "SELECT AVG(ELAPSED_TIME) FROM V_$SQLAREA;"
        ;;
    wait_time)
        exec_sql "SELECT SUM(TIME) FROM V_$WAITSTAT;"
        ;;
    *)
        echo "Invalid parameter: $1"
        exit 1
        ;;
esac

设置脚本执行权限:

bash
chmod +x /etc/zabbix/scripts/oracle_monitor.sh
chown zabbix:zabbix /etc/zabbix/scripts/oracle_monitor.sh

3.3 配置Zabbix Agent监控项

创建Zabbix Agent配置文件 /etc/zabbix/zabbix_agentd.d/oracle.conf

ini
# Oracle监控项配置

# 实例状态
UserParameter=oracle.instance.status[*],/etc/zabbix/scripts/oracle_monitor.sh instance_status

# 会话数
UserParameter=oracle.sessions.active[*],/etc/zabbix/scripts/oracle_monitor.sh active_sessions
UserParameter=oracle.sessions.inactive[*],/etc/zabbix/scripts/oracle_monitor.sh inactive_sessions

# CPU使用率
UserParameter=oracle.cpu.usage[*],/etc/zabbix/scripts/oracle_monitor.sh cpu_usage

# 内存使用
UserParameter=oracle.memory.sga[*],/etc/zabbix/scripts/oracle_monitor.sh memory_sga
UserParameter=oracle.memory.pga[*],/etc/zabbix/scripts/oracle_monitor.sh memory_pga

# 表空间使用率
UserParameter=oracle.tablespace.usage[*],/etc/zabbix/scripts/oracle_monitor.sh tablespace_usage

# I/O统计
UserParameter=oracle.io.read_bytes[*],/etc/zabbix/scripts/oracle_monitor.sh io_read_bytes
UserParameter=oracle.io.write_bytes[*],/etc/zabbix/scripts/oracle_monitor.sh io_write_bytes

# SQL执行时间
UserParameter=oracle.sql.execute_time[*],/etc/zabbix/scripts/oracle_monitor.sh sql_execute_time

# 等待事件时间
UserParameter=oracle.wait.time[*],/etc/zabbix/scripts/oracle_monitor.sh wait_time

重启Zabbix Agent服务:

bash
systemctl restart zabbix-agent

4. 导入Zabbix监控模板

4.1 创建监控模板

在Zabbix Web界面中创建Oracle监控模板:

  1. 登录Zabbix Web界面
  2. 导航到"Configuration" > "Templates"
  3. 点击"Create template"
  4. 配置模板基本信息:
    • Template name: Oracle Database Monitoring
    • Groups: Templates
  5. 点击"Add"保存模板

4.2 添加监控项

在模板中添加监控项:

  1. 进入模板详情页,点击"Items"标签
  2. 点击"Create item"
  3. 配置监控项,例如:
    • Name: Oracle Active Sessions
    • Type: Zabbix agent
    • Key: oracle.sessions.active[{$ORACLE_SID}]
    • Type of information: Numeric (unsigned)
    • Units: sessions
    • Update interval: 60s
    • History storage period: 7d
    • Trend storage period: 30d
  4. 点击"Add"保存监控项

重复上述步骤,添加其他监控项。

4.3 添加触发器

在模板中添加触发器:

  1. 进入模板详情页,点击"Triggers"标签
  2. 点击"Create trigger"
  3. 配置触发器,例如:
    • Name: High Active Sessions on
    • Expression: {Oracle Database Monitoring:oracle.sessions.active[{$ORACLE_SID}].avg(5m)}>100
    • Severity: Warning
    • Description: Oracle instance {HOST.NAME} has high active sessions:
  4. 点击"Add"保存触发器

重复上述步骤,添加其他触发器。

4.4 添加图形

在模板中添加图形:

  1. 进入模板详情页,点击"Graphs"标签
  2. 点击"Create graph"
  3. 配置图形,例如:
    • Name: Oracle Sessions
    • Width: 900
    • Height: 200
    • Items: 添加oracle.sessions.active和oracle.sessions.inactive监控项
  4. 点击"Add"保存图形

重复上述步骤,添加其他图形。

5. 关联模板到主机

将创建好的模板关联到Oracle数据库主机:

  1. 导航到"Configuration" > "Hosts"
  2. 找到目标主机,点击"Templates"
  3. 在"Link new templates"中搜索并选择"Oracle Database Monitoring"
  4. 点击"Update"保存配置

核心监控指标

Zabbix可以监控Oracle数据库的多种指标,包括:

1. 数据库基本信息

指标名称描述监控方法正常范围19c/21c差异
实例状态数据库实例运行状态V$INSTANCEOPEN无明显差异
数据库版本数据库版本信息V$VERSION19.0.0.0或21.0.0.0版本号不同
启动时间实例连续运行时间V$INSTANCE根据业务需求无明显差异

2. 会话指标

指标名称描述监控方法正常范围19c/21c差异
活动会话数当前活动会话数量V$SESSION< 最大连接数的80%21c支持更高并发
非活动会话数当前非活动会话数量V$SESSION< 最大连接数的20%无明显差异
总会话数当前总会话数量V$SESSION< 最大连接数21c支持更多会话
会话命中率会话缓存命中率V$SESSION_CACHE> 90%无明显差异

3. 性能指标

指标名称描述监控方法正常范围19c/21c差异
SQL执行时间SQL语句平均执行时间V$SQLAREA< 1秒21c优化SQL执行计划
解析时间SQL解析时间占比V$SYSSTAT< 10%无明显差异
硬解析率硬解析占总解析的比例V$SYSSTAT< 5%无明显差异
等待事件时间等待事件总时间V$WAITSTAT< 10% CPU时间无明显差异

4. 资源使用指标

指标名称描述监控方法正常范围19c/21c差异
CPU使用率数据库CPU使用百分比V$SYSSTAT< 80%21c优化CPU使用
SGA使用率系统全局区使用率V$SGASTAT< 90%无明显差异
PGA使用率程序全局区使用率V$PGASTAT< 90%21c优化PGA管理
共享池使用率共享池使用率V$SGASTAT< 90%无明显差异
缓冲区缓存命中率缓冲区缓存命中率V$SYSSTAT> 95%无明显差异

5. 存储指标

指标名称描述监控方法正常范围19c/21c差异
表空间使用率表空间使用百分比DBA_TABLESPACE_USAGE_METRICS< 80%无明显差异
数据文件大小数据文件总大小DBA_DATA_FILES根据业务需求无明显差异
临时表空间使用率临时表空间使用百分比V$TEMP_SPACE_HEADER< 90%无明显差异
日志文件大小日志文件总大小V$LOG根据业务需求无明显差异

6. I/O指标

指标名称描述监控方法正常范围19c/21c差异
读取字节数每秒读取的字节数V$FILESTAT根据存储性能21c优化I/O处理
写入字节数每秒写入的字节数V$FILESTAT根据存储性能21c优化I/O处理
读取次数每秒读取次数V$FILESTAT根据存储性能无明显差异
写入次数每秒写入次数V$FILESTAT根据存储性能无明显差异
I/O等待时间平均I/O等待时间V$FILESTAT< 20ms无明显差异

告警配置

1. 告警级别设置

Zabbix支持多种告警级别,建议根据问题严重程度设置:

级别描述示例场景
信息普通信息,不影响系统运行数据库启动/关闭
警告需要关注,可能影响系统性能活动会话数接近阈值
一般严重系统出现问题,影响部分功能表空间使用率超过80%
严重系统出现严重问题,影响主要功能表空间使用率超过90%
灾难系统完全不可用数据库实例关闭

2. 告警通知方式

Zabbix支持多种告警通知方式,包括:

  • 邮件通知:通过SMTP发送告警邮件
  • 短信通知:通过短信网关发送告警短信
  • 微信通知:通过微信公众号或企业微信发送告警
  • Slack通知:通过Slack发送告警
  • 自定义脚本通知:通过自定义脚本发送告警

3. 告警模板配置

配置告警通知模板,例如邮件模板:

  1. 导航到"Administration" > "Media types"
  2. 点击"Email",然后点击"Message templates"
  3. 配置告警邮件模板:
    • 主题:{TRIGGER.STATUS}: {TRIGGER.NAME} on
    • 正文:
      Host: {HOST.NAME}
      Trigger: {TRIGGER.NAME}
      Status: {TRIGGER.STATUS}
      Severity: {TRIGGER.SEVERITY}
      Time: {EVENT.TIME}
      Date: {EVENT.DATE}
      Item: {ITEM.NAME}
      Value: {ITEM.VALUE}
  4. 点击"Update"保存配置

19c与21c版本差异

特性19c21c
动态性能视图丰富更丰富,新增多个视图
并发支持更高,支持更多并发会话
I/O处理良好优化,I/O性能提升
资源管理完善更完善,支持细粒度资源控制
监控指标精度秒级支持毫秒级指标
SQL执行计划稳定优化,响应时间更稳定

版本差异处理

  1. 监控脚本适配

    • 针对21c新增的动态性能视图,更新监控脚本
    • 调整监控指标的采集逻辑,适应21c的特性
  2. 告警阈值调整

    • 针对21c支持更高并发的特性,调整会话数告警阈值
    • 根据21c的性能提升,调整I/O和CPU使用率的告警阈值
  3. 监控模板优化

    • 为19c和21c创建不同的监控模板
    • 在模板中使用宏变量,方便根据版本调整配置

最佳实践

1. 监控策略

  • 分层监控

    • 基础设施层:监控服务器CPU、内存、磁盘
    • 数据库层:监控Oracle实例、性能、资源使用
    • 应用层:监控应用响应时间、吞吐量
  • 监控频率

    • 核心指标:每60秒采集一次
    • 次要指标:每5分钟采集一次
    • 历史数据:保留7天历史数据,30天趋势数据
  • 告警策略

    • 设置多级告警,根据严重程度采取不同的处理措施
    • 配置告警抑制规则,避免告警风暴
    • 建立告警处理流程,明确责任人

2. 性能优化

  • 监控脚本优化

    • 减少不必要的SQL查询,只采集必要的指标
    • 优化SQL查询,减少数据库负载
    • 使用批量查询,减少连接开销
  • Zabbix Agent优化

    • 调整Agent的缓存大小,提高性能
    • 配置合理的超时时间,避免Agent挂起
    • 使用主动模式,减少Server的负载
  • Zabbix Server优化

    • 配置合理的缓存大小,提高性能
    • 使用分区表,优化历史数据查询
    • 配置合理的进程数,提高并发处理能力

3. 高可用配置

  • Zabbix Server高可用

    • 部署Zabbix Server集群,实现主备切换
    • 使用共享数据库,确保数据一致性
    • 配置负载均衡,分散客户端请求
  • Zabbix Agent高可用

    • 在集群环境中,每个节点都安装Zabbix Agent
    • 配置Agent的高可用参数,确保监控连续性

4. 安全性配置

  • 权限控制

    • 使用只读用户连接Oracle数据库,限制权限
    • 限制Zabbix Agent的执行权限,避免安全风险
    • 配置Zabbix Web的用户认证,启用RBAC
  • 网络安全

    • 使用加密传输,保护监控数据
    • 配置防火墙,限制Zabbix Server和Agent之间的通信
    • 使用VPN或专用网络连接,避免网络攻击
  • 数据安全

    • 定期备份Zabbix配置和历史数据
    • 加密存储敏感数据,如数据库密码
    • 配置审计日志,记录监控系统的访问行为

常见问题(FAQ)

1. Zabbix Agent无法采集Oracle指标

问题:Zabbix Web界面显示Oracle监控项状态为"Not supported"

解决方案

  • 检查Zabbix Agent是否正常运行:systemctl status zabbix-agent
  • 检查监控脚本是否有执行权限:chmod +x /etc/zabbix/scripts/oracle_monitor.sh
  • 检查脚本执行结果:/etc/zabbix/scripts/oracle_monitor.sh active_sessions
  • 检查Oracle用户权限是否足够
  • 检查TNS配置是否正确

2. 监控数据不准确

问题:Zabbix显示的Oracle监控数据与实际情况不符

解决方案

  • 检查监控脚本的SQL查询是否正确
  • 检查Oracle用户是否有足够的权限查看相关视图
  • 检查监控频率是否合理,避免数据采样不足
  • 检查Zabbix Agent的缓存配置,避免数据延迟

3. 告警频繁触发

问题:Zabbix频繁发送Oracle相关告警,导致告警风暴

解决方案

  • 调整告警阈值,使其更合理
  • 增加告警持续时间,避免瞬时峰值触发告警
  • 配置告警抑制规则,减少重复告警
  • 优化监控指标,减少噪声指标
  • 建立告警聚合规则,合并相关告警

4. Zabbix Server性能问题

问题:Zabbix Server响应缓慢,监控数据延迟

解决方案

  • 优化Zabbix Server配置,增加缓存大小
  • 调整历史数据和趋势数据的存储周期
  • 优化数据库查询,使用索引
  • 考虑使用分布式Zabbix架构,分散负载

5. 19c和21c监控配置差异

问题:同一套监控配置在19c和21c上表现不同

解决方案

  • 针对不同版本创建独立的监控模板
  • 调整告警阈值,适应不同版本的性能特性
  • 更新监控脚本,支持21c新增的动态性能视图
  • 使用宏变量,方便根据版本调整配置

6. 监控脚本导致Oracle性能问题

问题:监控脚本执行导致Oracle数据库性能下降

解决方案

  • 减少监控频率,避免过于频繁的查询
  • 优化SQL查询,减少数据库负载
  • 使用批量查询,减少连接开销
  • 只采集必要的指标,减少查询数量
  • 考虑使用Oracle Enterprise Manager Cloud Control进行更高效的监控

总结

Zabbix是一款功能强大的开源监控系统,可以有效地监控Oracle数据库的性能、可用性和资源使用情况。通过合理的配置和优化,可以实现对Oracle数据库的全面监控,并在出现问题时及时发出告警。

在实际生产环境中,需要根据数据库版本(19c/21c)、规模和业务需求,调整监控配置和告警策略。同时,要注意监控系统本身的性能和可用性,避免对被监控系统产生负面影响。

通过遵循最佳实践,包括分层监控、性能优化、高可用配置和安全性配置,可以建立一个高效、可靠的Oracle数据库监控系统,确保数据库的稳定运行和良好性能。