Zabbix 6 通过 ODBC 监控 Oracle 19C 详细配置过程
一、环境准备
1.1 系统要求
- Zabbix Server 6.0+ (已安装ODBC支持)
- Oracle 19c 数据库
- Oracle Instant Client
- unixODBC 或 iODBC
1.2 安装Oracle Instant Client
# 下载Oracle Instant Client (根据系统选择版本)
# 以CentOS/RHEL为例:
wget https://download.oracle.com/otn_software/linux/instantclient/1913000/oracle-instantclient19.13-basic-19.13.0.0.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/1913000/oracle-instantclient19.13-odbc-19.13.0.0.0-1.x86_64.rpm
# 安装
sudo rpm -ivh oracle-instantclient19.13-basic-19.13.0.0.0-1.x86_64.rpm
sudo rpm -ivh oracle-instantclient19.13-odbc-19.13.0.0.0-1.x86_64.rpm
1.3 安装ODBC驱动管理器
# CentOS/RHEL
sudo yum install -y unixODBC unixODBC-devel
# Ubuntu/Debian
sudo apt-get install -y unixodbc unixodbc-dev
二、配置ODBC连接
2.1 配置环境变量
# 编辑/etc/profile.d/oracle.sh
sudo tee /etc/profile.d/oracle.sh << 'EOF'
export ORACLE_HOME=/usr/lib/oracle/19.13/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
EOF
source /etc/profile.d/oracle.sh
2.2 配置ODBC驱动
# 查看ODBC配置文件位置
odbcinst -j
# 编辑/etc/odbcinst.ini
sudo tee /etc/odbcinst.ini << 'EOF'
[Oracle19]
Description = Oracle ODBC driver for Oracle 19c
Driver = /usr/lib/oracle/19.13/client64/lib/libsqora.so.19.1
Setup = /usr/lib/oracle/19.13/client64/lib/libodbc.so
FileUsage = 1
Threading = 0
EOF
2.3 配置数据源
# 编辑/etc/odbc.ini (系统DSN)
sudo tee /etc/odbc.ini << 'EOF'
[OracleDB]
Description = Oracle Database Connection
Driver = Oracle19
ServerName = //<oracle_host>:<port>/<service_name>
UserID =
Password =
Database =
Port = 1521
EOF
# 或者使用用户DSN ~/.odbc.ini
2.4 测试ODBC连接
# 安装isql工具
sudo yum install -y unixODBC-utils
# 测试连接
isql -v OracleDB username password
三、Zabbix Server配置
3.1 安装Zabbix ODBC支持
# 安装Zabbix Server(如尚未安装)
# 对于已安装的Zabbix,确保包含ODBC支持
# 重新编译Zabbix Server支持ODBC
# 编译时需要添加--with-unixodbc参数
3.2 创建ODBC监控项
方法一:使用Zabbix Agent 2
配置Zabbix Agent 2
# /etc/zabbix/zabbix_agent2.conf
Plugins.Oracle.Sessions.DataSource=OracleDB
Plugins.Oracle.Sessions.User=zabbix
Plugins.Oracle.Sessions.Password=your_password
可用监控项示例:
oracle.custom.query[<dsn>,<username>,<password>,<query>]
oracle.db.discovery[<dsn>,<username>,<password>]
oracle.tablespace.stats[<dsn>,<username>,<password>]
方法二:使用ODBC监控项类型
创建ODBC监控项:
- 类型:
Database monitor
- 键值:
db.odbc.select[<unique short description>,<dsn>,<username>,<password>,<sql query>]
示例监控项:
-- 监控表空间使用率
SELECT
tablespace_name,
ROUND((1 - (free_space / total_space)) * 100, 2) as pct_used
FROM (
SELECT
a.tablespace_name,
SUM(a.bytes) as total_space,
SUM(NVL(b.bytes,0)) as free_space
FROM dba_data_files a
LEFT JOIN dba_free_space b ON a.tablespace_name = b.tablespace_name
GROUP BY a.tablespace_name
)
WHERE ROUND((1 - (free_space / total_space)) * 100, 2) > 80
-- 监控会话数
SELECT COUNT(*) FROM v$session WHERE status = 'ACTIVE'
## 四、创建Oracle监控模板
### 4.1 基础监控项目
| 监控项名称 | 键值 | SQL查询示例 |
|-----------|------|------------|
| Oracle会话数 | `db.odbc.select[session_count,OracleDB,zabbix,pwd,SELECT COUNT(*) FROM v$session]` | |
| 活跃会话数 | `db.odbc.select[active_sessions,...]` | `SELECT COUNT(*) FROM v$session WHERE status='ACTIVE'` |
| 表空间使用率 | `db.odbc.select[tablespace_usage,...]` | 上述表空间查询 |
### 4.2 创建自动发现规则
```json
{
"data": [
{
"{#TABLESPACE_NAME}": "USERS",
"{#PCT_USED}": "85.5"
}
]
}
4.3 触发器配置示例
# 表空间使用率超过90%
表达式: {Oracle by ODBC:db.odbc.select[tablespace_usage,OracleDB,zabbix,pwd].last()} > 90
严重性: 高
# 会话数超过阈值
表达式: {Oracle by ODBC:db.odbc.select[session_count,...].last()} > 200
严重性: 警告
五、Oracle数据库准备
5.1 创建监控用户
-- 创建Zabbix监控用户
CREATE USER zabbix IDENTIFIED BY "StrongPassword123";
-- 授予必要权限
GRANT CREATE SESSION TO zabbix;
GRANT SELECT ANY DICTIONARY TO zabbix;
GRANT SELECT ON v_$session TO zabbix;
GRANT SELECT ON v_$sysstat TO zabbix;
GRANT SELECT ON v_$system_event TO zabbix;
GRANT SELECT ON dba_data_files TO zabbix;
GRANT SELECT ON dba_free_space TO zabbix;
GRANT SELECT ON dba_tablespaces TO zabbix;
-- 如果使用自动发现,可能需要更多权限
5.2 创建监控视图(可选)
CREATE OR REPLACE VIEW zabbix_tablespace_usage AS
SELECT
tablespace_name,
ROUND((1 - (free_space / total_space)) * 100, 2) as pct_used
FROM (
SELECT
a.tablespace_name,
SUM(a.bytes) as total_space,
SUM(NVL(b.bytes,0)) as free_space
FROM dba_data_files a
LEFT JOIN dba_free_space b ON a.tablespace_name = b.tablespace_name
GROUP BY a.tablespace_name
);
六、故障排除
6.1 常见问题及解决
# 1. ODBC连接测试失败
# 检查tnsnames.ora配置
ls -la $ORACLE_HOME/network/admin/
# 2. 权限问题
# 确保Oracle用户有足够权限
# 3. 驱动问题
# 检查libsqora.so是否存在
ldd /usr/lib/oracle/19.13/client64/lib/libsqora.so.19.1
# 4. Zabbix获取不到数据
# 查看Zabbix Server日志
tail -f /var/log/zabbix/zabbix_server.log
6.2 调试命令
# 测试ODBC连接
echo "select 1 from dual;" | isql -v OracleDB zabbix password -b
# 检查ODBC配置
odbcinst -q -d
odbcinst -q -s
# 查看共享库
ldconfig -p | grep oracle
七、安全建议
最小权限原则:只授予监控所需的最小权限
密码安全:使用强密码,定期更换
网络隔离:限制数据库访问来源IP
加密传输:考虑使用SSL/TLS连接
审计日志:监控对监控账户的访问
八、性能优化建议
查询优化:避免复杂查询,使用索引
采样频率:合理设置更新间隔
历史数据:调整历史数据保留策略
批量获取:使用自动发现减少查询次数
注意:实际配置时请替换以下信息:
<oracle_host>:Oracle数据库服务器地址
<port>:Oracle监听端口(默认1521)
<service_name>:Oracle服务名
- 用户名和密码使用实际的监控账户
此配置提供了从基础到高级的完整监控方案,可根据实际需求调整监控项和阈值。