外观
Oracle Zabbix监控
概述
Zabbix是一款功能强大的开源监控系统,广泛应用于各种IT基础设施的监控。通过Zabbix监控Oracle数据库,可以实现对数据库性能、可用性和资源使用情况的全面监控,并在出现问题时及时发出告警。
Zabbix监控Oracle数据库的核心组件包括:Zabbix Server、Zabbix Agent(或Zabbix Sender)、Oracle监控模板和自定义脚本。
监控架构设计
架构组件
- Oracle数据库:监控目标,提供动态性能视图和系统视图
- Zabbix Agent:安装在数据库服务器上,执行监控脚本并将数据发送到Zabbix Server
- Zabbix Server:负责数据存储、处理和告警
- Zabbix Web界面:提供可视化监控界面和配置管理
- 监控模板:预定义的监控项、触发器和图形
- 自定义脚本:用于采集Oracle特定指标的脚本
架构图
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Oracle 19c/21c │◀────│ Zabbix Agent │────▶│ Zabbix Server │
│ │ │ + 监控脚本 │ │ │
└─────────────────┘ └─────────────────┘ │ │
│ │
└─────────────────┘
│
▼
┌─────────────────┐
│ Zabbix Web UI │
│ │
└─────────────────┘数据流向
- Zabbix Server通过Zabbix Agent向数据库服务器发送监控请求
- Zabbix Agent执行预定义的监控脚本或命令
- 监控脚本连接Oracle数据库,查询动态性能视图获取指标
- Zabbix Agent将采集到的指标发送回Zabbix Server
- Zabbix Server存储指标数据,并根据触发器规则判断是否触发告警
- 如果触发告警,Zabbix Server通过配置的通知方式发送告警信息
- 用户通过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-agent1.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-agent2. 配置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)
)
)
EOF3.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.sh3.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-agent4. 导入Zabbix监控模板
4.1 创建监控模板
在Zabbix Web界面中创建Oracle监控模板:
- 登录Zabbix Web界面
- 导航到"Configuration" > "Templates"
- 点击"Create template"
- 配置模板基本信息:
- Template name: Oracle Database Monitoring
- Groups: Templates
- 点击"Add"保存模板
4.2 添加监控项
在模板中添加监控项:
- 进入模板详情页,点击"Items"标签
- 点击"Create item"
- 配置监控项,例如:
- 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
- 点击"Add"保存监控项
重复上述步骤,添加其他监控项。
4.3 添加触发器
在模板中添加触发器:
- 进入模板详情页,点击"Triggers"标签
- 点击"Create trigger"
- 配置触发器,例如:
- 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:
- 点击"Add"保存触发器
重复上述步骤,添加其他触发器。
4.4 添加图形
在模板中添加图形:
- 进入模板详情页,点击"Graphs"标签
- 点击"Create graph"
- 配置图形,例如:
- Name: Oracle Sessions
- Width: 900
- Height: 200
- Items: 添加oracle.sessions.active和oracle.sessions.inactive监控项
- 点击"Add"保存图形
重复上述步骤,添加其他图形。
5. 关联模板到主机
将创建好的模板关联到Oracle数据库主机:
- 导航到"Configuration" > "Hosts"
- 找到目标主机,点击"Templates"
- 在"Link new templates"中搜索并选择"Oracle Database Monitoring"
- 点击"Update"保存配置
核心监控指标
Zabbix可以监控Oracle数据库的多种指标,包括:
1. 数据库基本信息
| 指标名称 | 描述 | 监控方法 | 正常范围 | 19c/21c差异 |
|---|---|---|---|---|
| 实例状态 | 数据库实例运行状态 | V$INSTANCE | OPEN | 无明显差异 |
| 数据库版本 | 数据库版本信息 | V$VERSION | 19.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. 告警模板配置
配置告警通知模板,例如邮件模板:
- 导航到"Administration" > "Media types"
- 点击"Email",然后点击"Message templates"
- 配置告警邮件模板:
- 主题:{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}
- 点击"Update"保存配置
19c与21c版本差异
| 特性 | 19c | 21c |
|---|---|---|
| 动态性能视图 | 丰富 | 更丰富,新增多个视图 |
| 并发支持 | 高 | 更高,支持更多并发会话 |
| I/O处理 | 良好 | 优化,I/O性能提升 |
| 资源管理 | 完善 | 更完善,支持细粒度资源控制 |
| 监控指标精度 | 秒级 | 支持毫秒级指标 |
| SQL执行计划 | 稳定 | 优化,响应时间更稳定 |
版本差异处理
监控脚本适配:
- 针对21c新增的动态性能视图,更新监控脚本
- 调整监控指标的采集逻辑,适应21c的特性
告警阈值调整:
- 针对21c支持更高并发的特性,调整会话数告警阈值
- 根据21c的性能提升,调整I/O和CPU使用率的告警阈值
监控模板优化:
- 为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数据库监控系统,确保数据库的稳定运行和良好性能。
