Oracle EBS数据库监控-Zabbix+zabbix-agent2+orabbix

Zabbix 官方解决方案给出了利用zabbix-agent2、ODBC 监控Oracle数据库,但是支持的版本是12.2及以上版本,经过分析zabbix-agent2的源码是Oracle的插件部分利用了Oralce 12.2 的一个内置新函数 json_table、json_object,用sql查询出12.2以下版本是没有集成这个函数的,所以导致了官方解决方案只能监控较高版本的,监控12.2以下版本的可以用orabbix。

基础组件-Zabbix 服务端安装

MySQL8.0安装

采用yum源安装,参考官方文档

https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

其中,8.0安全机制升高,在配置zabbix 的时候为了避免前端配置报错,需要在配置文件中加入一个允许本地登录的参数

vi /etc/my.cnf
default_authentication_plugin=mysql_native_password
#重启数据库
systemctl restart  mysqld.service

Zabbix 安装

因为受限于Linux 操作系统版本:CentOS7,只能安装Zabbix 5.0版本了,安装步骤参考官方文档:

https://www.zabbix.com/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=apache

其中执行下面这条命令的时候

# yum install zabbix-server-mysql zabbix-agent

把zabbix-agent 改成 zabbix-agent2如下:

    # yum install zabbix-server-mysql zabbix-agent2

因为zabbix-agent2不但包含了zabbix-agent原有功能还集成了数据库监控插件。

还要注意,创建完数据库监控用户后,需要用参数mysql_native_password 修改下密码:

ALTER USER 'zabbix'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Oracle 各个版本监控说明

针对Oracle数据库的不同版本,分别采用两个agent:官方的zabbix-agent2及三方的orabbix。

官方的zabbix-agent2的Oralce数据采集插件用到12C的一个内置新函数 json_table、json_object,这个函数从12.1版本才开始集成,直接把sql查出的数据封装成json格式发送给zabbix-server服务器。

12.1以下版本是没有集成这个函数的,所以导致了zabbix官方解决方案只能监控较高版本(12.1及以上)的,监控12.1以下版本的可以用orabbix。

其中配置 /usr/lib/systemd/system/zabbix-agent2.service

12.1及以上版本

利用zabbix-agent2 监控Oracle 高版本数据库

配置zabbix-agent2

通过 ps -ef | grep zabbix_agent2 来确定使用的配置文件

[root@test75v234 ~]# ps -ef | grep zabbix_agent2
zabbix    2166     1  0 Oct28 ?        01:46:47 /usr/sbin/zabbix_agent2 -c /etc/zabbix/zabbix_agent2.conf
root     19423 19352  0 16:06 pts/0    00:00:00 grep --color=auto zabbix_agent2
[root@test75v234 ~]# 

修改/etc/zabbix/zabbix_agent2.conf

sed -i 's/Server=127.0.0.1/Server=【改成zabbix server实际IP】/' /etc/zabbix/zabbix_agentd.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive=【改成zabbix server实际IP】/' /etc/zabbix/zabbix_agentd.conf
sed -i 's/Hostname=Zabbix server/Hostname=【改成zabbix agent2所在的机器的hostname】/'  /etc/zabbix/zabbix_agentd.conf
sed -i 's/^# Plugins.Oracle.CallTimeout.*/Plugins.Oracle.CallTimeout=10/' /etc/zabbix/zabbix_agent2.conf
sed -i 's/^# Plugins.Oracle.ConnectTimeout.*/Plugins.Oracle.ConnectTimeout=1/' /etc/zabbix/zabbix_agent2.conf
sed -i 's/^# Plugins.Oracle.KeepAlive=300.*/Plugins.Oracle.KeepAlive=300/' /etc/zabbix/zabbix_agent2.conf

查看参数设置

grep -Ev '^#|^$' /etc/zabbix/zabbix_agent2.conf

配置Oracle客户端

在root用户下操作

下载最新版本客户端即可,参考文档:
https://docs.oracle.com/en/database/oracle/oracle-database/21/lacli/install-instant-client-using-zip.html#GUID-D3DCB4FB-D3CA-4C25-BE48-3A1FB5A22E84

配置LD_LIBRARY_PATH 需要将配置直接写到配置文件中

echo "LD_LIBRARY_PATH=/apps/oracle/instantclient:\$LD_LIBRARY_PATH" > /etc/sysconfig/zabbix-agent2

非systemd的系统
在 /etc/init.d/zabbix-agent2 文件的 ### END INIT INFO 这一行下边添加环境变量

# export ORACLE_HOME=/apps/oracle
export LD_LIBRARY_PATH=/apps/oracle/instantclient:$LD_LIBRARY_PATH
# export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
# export TNS_ADMIN=/apps/oracle/instantclient/network/admin

重启zabbix-agent2

systemctl daemon-reload
source /etc/profile
systemctl restart zabbix-agent2.service
ps -ef|grep zabbix

创建数据库专用用户

alter session set container=orapdb1;--切换到PDB
CREATE USER zabbix_mon IDENTIFIED BY zabbix_mon;
GRANT CONNECT, CREATE SESSION TO zabbix_mon;
GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO zabbix_mon;
GRANT SELECT ON DBA_TABLESPACES TO zabbix_mon;
GRANT SELECT ON DBA_USERS TO zabbix_mon;
GRANT SELECT ON SYS.DBA_DATA_FILES TO zabbix_mon;
GRANT SELECT ON V_$ACTIVE_SESSION_HISTORY TO zabbix_mon;
GRANT SELECT ON V_$ARCHIVE_DEST TO zabbix_mon;
GRANT SELECT ON V_$ASM_DISKGROUP TO zabbix_mon;
GRANT SELECT ON V_$DATABASE TO zabbix_mon;
GRANT SELECT ON V_$DATAFILE TO zabbix_mon;
GRANT SELECT ON V_$INSTANCE TO zabbix_mon;
GRANT SELECT ON V_$LOG TO zabbix_mon;
GRANT SELECT ON V_$OSSTAT TO zabbix_mon;
GRANT SELECT ON V_$PGASTAT TO zabbix_mon;
GRANT SELECT ON V_$PROCESS TO zabbix_mon;
GRANT SELECT ON V_$RECOVERY_FILE_DEST TO zabbix_mon;
GRANT SELECT ON V_$RESTORE_POINT TO zabbix_mon;
GRANT SELECT ON V_$SESSION TO zabbix_mon;
GRANT SELECT ON V_$SGASTAT TO zabbix_mon;
GRANT SELECT ON V_$SYSMETRIC TO zabbix_mon;
GRANT SELECT ON V_$SYSTEM_PARAMETER TO zabbix_mon;

配置zabbix模板

zabbix5.0已经自带Oracle监控模块,添加主机时选择Template DB Oracle by Zabbix Agent 2 这个模板即可。
然后配置如下四个宏的值

配置宏

然后就完事了如下图:

12.1及以下数据库监控

采用orabbix监控,orabbix架构如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8x2AaYD-1637231332263)(http://www.smartmarmot.com/wiki/images/1/1f/Orabbix_architecture.png)]
安装步骤参见:http://www.smartmarmot.com/wiki/index.php?title=Orabbix

官网现有版本不兼容zabbix 5.0 ,有个老哥二次开发了下放到github上,把orabbix-1.2.4w.jar 替换官方的现有jar包就可以用了。
https://github.com/wanghy8166/orabbix/blob/master/orabbix-1.2.4w.jar

配置表空间自动发现规则

当我们添加表空间的时候,希望zabbix能自动识别我们添加的表空间,而不用去orabbix的sql查询模板中添加一段sql,然后再去zabbix中添加监控项,配置高级等。但是这个地方有个问题,就是自动发现规则orabbix没有实现,得需要借助zabbix-agent去二次配置来实现向zabbix serve服务器来发送json数据,步骤如下:

  1. 通过sqlplus spool出表空间文件,以文本形式存放(mornitor_tbs.sh)。
  2. 编写shell将文本文件处理成json格式(oracle_discovery.sh)
  3. 配置zabbix-agent客户端,加入客户化的自动发现规则(oracle_check.sh)

三个脚本如下:

mornitor_tbs.sh

#此脚本需要放到crontab中调用  */10 * * * * /home/orasit/orabbix/monitor_tbs.sh > /home/orasit/orabbix/monitor_tbs.log
#!/bin/bash
source /home/orasit/.bash_profile
sqlplus -s apps/apps > /tmp/tablespace.log<<\EOF
set linesize 140 pagesize 10000
col "Status" for a10
col "Name" for a25
col "Type" for a10
col "Extent" for a15
SELECT d.status "Status",
       d.tablespace_name "Name",
       d.contents "Type",
       d.extent_management "Extent",
       ROUND(NVL(a.bytes, 0)) "Size (M)",
       ROUND(NVL(a.bytes - NVL(f.bytes, 0), 0)) "Used (M)",
       round(NVL((a.bytes - NVL(f.bytes, 0)) / a.bytes * 100, 0), 2) "Used %"
  FROM sys.dba_tablespaces d,
       (SELECT tablespace_name, SUM(DECODE(autoextensible, 'YES', maxbytes, 'NO', bytes))/1024/1024 bytes
          FROM dba_data_files
         GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes)/1024/1024 bytes
          FROM dba_free_space
         GROUP BY tablespace_name) f
 WHERE d.tablespace_name = a.tablespace_name(+)
       AND d.tablespace_name = f.tablespace_name(+)
       --AND d.tablespace_name NOT IN ('SYSAUX', 'SYSTEM')
       AND NOT (d.extent_management LIKE 'LOCAL' AND d.contents LIKE 'TEMPORARY')
UNION ALL
SELECT d.status "Status",
       d.tablespace_name "Name",
       d.contents "Type",
       d.extent_management "Extent",
       ROUND(NVL(a.bytes, 0)) "Size (M)",
       ROUND(NVL(t.bytes, 0)) "Used (M)",
       round(NVL(t.bytes / a.bytes * 100, 0), 2) "Used %"
  FROM sys.dba_tablespaces d,
       (SELECT tablespace_name, SUM(bytes)/1024/1024 bytes
          FROM dba_temp_files
         GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes_cached)/1024/1024 bytes
          FROM v$temp_extent_pool
         GROUP BY tablespace_name) t
 WHERE d.tablespace_name = a.tablespace_name(+)
       AND d.tablespace_name = t.tablespace_name(+)
       AND d.extent_management LIKE 'LOCAL'
       AND d.contents LIKE 'TEMPORARY'
 ORDER BY 7;
EOF
sed -i '$d' /tmp/tablespace.log
sed -i '$d' /tmp/tablespace.log
sed -i 's/,//g' /tmp/tablespace.log

下这两个脚本放到zabbix-agent的配置文件(/etc/zabbix/zabbix_agentd.conf)用

#在/etc/zabbix/zabbix_agentd.conf最后加入
#表空间自动发现及告警
UserParameter=ora.tbs.discovery,/etc/zabbix/zabbix_agentd.d/oracle_discovery.sh
UserParameter=tablespace[*],/etc/zabbix/zabbix_agentd.d/oracle_check.sh $1 $2

oracle_discovery.sh

#!/bin/bash
TABLESPACE=`cat /tmp/tablespace.log |awk '{print$2}'|awk 'NR>3{print}'`
COUNT=`echo "$TABLESPACE" |wc -l`
INDEX=0
echo '{"data":['
echo "$TABLESPACE" | while read LINE; do
echo -n '{"{#TABLESPACE}":"'$LINE'"}'
INDEX=`expr $INDEX + 1`
if [ $INDEX -lt $COUNT ]; then
echo ','
fi
done
echo ']}'

oracle_check.sh

#!/bin/bash
EQ_DATA="$2"
ZBX_REQ_DATA_TAB="$1"
SOURCE_DATA=/tmp/tablespace.log
case $2 in
maxmb) grep -Ew "$ZBX_REQ_DATA_TAB" $SOURCE_DATA |awk '{print $5}';;
used) grep -Ew "$ZBX_REQ_DATA_TAB" $SOURCE_DATA |awk '{print $6}';;
autopercent) grep -Ew "$ZBX_REQ_DATA_TAB" $SOURCE_DATA |awk '{print $7}';;
*) echo $ERROR_WRONG_PARAM; exit 1;;
esac
exit 0

配置zabbix自动发现规则、监控项、告警

配置自动发现规则

配置3个监控项,在自动发现规则处点击监控项原型:

表空间{#TABLESPACE} 使用率

tablespace[{#TABLESPACE},autopercent]

表空间{#TABLESPACE}最大容量/M

tablespace[{#TABLESPACE},maxmb]

表空间{#TABLESPACE}已使用/M

tablespace[{#TABLESPACE},used]

配置触发器告警

TableSpace {#TABLESPACE} alarm

{Template_Oracle-orabbix:tablespace[{#TABLESPACE},autopercent].last()}>95

配置图形

配置图形聚合效果:


配置EBS监控的话可以参考如下SQL:

https://github.com/ikzelf/zbxdb/blob/master/etc/zbxdb_checks/oracle/ebs.cfg

https://github.com/ikzelf/zbxdb/blob/master/etc/zbxdb_checks/oracle/primary.11.cfg

其他参考资料:

https://oracle-base.com/articles/misc/an-introduction-to-json-support-in-the-oracle-database#json-support-in-12c
https://seeyon.ren/blog/index.php/archives/223/

https://blog.51cto.com/u_5646435/3170513

https://blog.cactifans.com/2020/05/19/Zabbix5.0%E7%89%88%E6%9C%ACAgent2%E5%AE%89%E8%A3%85/

https://bbs.huaweicloud.com/blogs/249319

https://blog.csdn.net/qq_22894935/article/details/115544995

https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/

https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/db/oracle_agent2?at=release/5.4

https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/src/go/plugins/oracle/README.md

https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/src/go/plugins/oracle

https://www.cnblogs.com/kerrycode/p/13368640.html

猜你喜欢

转载自blog.csdn.net/x6_9x/article/details/121407057