监控oracle有很多方式,目前主要使用的是通过第三方软件orabbix,它是通过jdbc连到各个oracle数据库上去执行sql,效率还可以,只是目前有个新需求,有个业务监控返回结果必须含有中文,而orabbix中无法配置字符集 ,导致存放到zabbix中时就会乱码,所以只能换一种方式,采用自带的database monitor来监控。整个配置过程很简单,主要是记录下字符集的转换配置。

Linux安装oracle客户端

下载linux客户端rpm包

[root@localhost oracle linux client]# ll
total 54436
-rw-r--r-- 1 root root 54172532 Jul 23 16:30 oracle-instantclient19.8-basic-19.8.0.0.0-1.x86_64.rpm
-rw-r--r-- 1 root root   612416 Jul 23 16:29 oracle-instantclient19.8-devel-19.8.0.0.0-1.x86_64.rpm
-rw-r--r-- 1 root root   246760 Jul 23 16:29 oracle-instantclient19.8-odbc-19.8.0.0.0-1.x86_64.rpm
-rw-r--r-- 1 root root   702872 Jul 23 16:29 oracle-instantclient19.8-sqlplus-19.8.0.0.0-1.x86_64.rpm

安装rpm包

rpm -ivh oracle-instantclient19.8-*.rpm

安装完以后会生成对应的oracle目录/usr/lib/oracle/19.8/client64

新建tns目录

[root@zabbix-wh-proxy client64]# mkdir -p network/admin

touch tnsnames.ora

设置环境变量

export ORACLE_HOME=/usr/lib/oracle/19.8/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64:$LD_LIBRARY_PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin

Linux安装odbc

yum -y install unixODBC unixODBC-devel

配置文件主要为两个,/etc/odbc.ini/etc/odbcinst.ini,后者配置驱动,前者配置数据库参数

cat /etc/odbcinst.ini

[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1

[MySQL ODBC 8.0 Unicode Driver]
Driver=/usr/lib64/libmyodbc8w.so
UsageCount=1

[MySQL ODBC 8.0 ANSI Driver]
Driver=/usr/lib64/libmyodbc8a.so
UsageCount=1


[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so.0

[OracleDriver]
Description= ODBC for Oracle
Driver= /usr/lib/oracle/19.8/client64/lib/libsqora.so.19.1

添加oracle的驱动到末尾,driver指向lib路径

cat /etc/odbc.ini

[test]
Driver = OracleDriver
ServerName = 192.168.2.112:1521/pdb12c
UserID = zabbix
Password = zabbix

测试配置

isql test

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

这里很简单就配置完了,只需要在web端添加database monitor就可以了,odbc.ini里设置的test就是唯一DSN

字符集问题

zabbix后台存放数据的库是mysql,是utf8字符集,在监控字符集为gbk的oracle时,会碰到一个问题,就是当sql返回结果含有中文时就会乱码,由于我之前所有的oracle监控都是通过orabbix来完成,对于这个问题始终无法解决。而通过odbc监控时,则可以通过修改odbc的配置来实现字符集的转换。

在odbc.ini里添加环境变量参数

DMEnvAttr = SQL_ATTR_UNIXODBC_ENVATTR={NLS_LANG=SIMPLIFIED CHINESE.AL32UTF8}

然后重新执行sql,就可以得到正确的中文返回结果。