文章目录
今天我们来讲讲如何通过zabbix4.4监控Oracle数据库、这里我们需要使用到一个监控插件:Orabbix。
1、什么是Orabbix?
Orabbix是一个旨在与Zabbix Enterprise Monitor配合使用的插件,可提供针对Oracle数据库的多层监视,性能和可用性报告以及度量以及服务器性能指标。 它提供了一种从众多Oracle实例获取数据的有效机制,并反过来将此信息提供给Zabbix服务器以用于监视和性能指标。然后,您可以利用Zabbix的报告功能来收集所有数据,并为利益相关者提供诸如图表和服务水平协议指标之类的分析。 当前的发行版包含一组预定义的模板,这些模板合并了初始部署中的警报和图形功能。但是,可以根据您的需求和数据/监视要求进行微调。
Orabbix官方网站:http://www.smartmarmot.com/
Orabbix官方文档:http://www.smartmarmot.com/wiki/index.php?title=Orabbix
Orabbix架构图
Orabbix是 SmartMarmot 的监控插件解决方案、当然 SmartMarmot 还提供多种数据库监控插件、例如:DBforBIX;Orabbix;MySQLBix;PostBIX。有兴趣的小伙伴可以去 SmartMarmot 的官方网站自行学习了解。说了这么多、那么Orabbix到底能监控哪些指标呢?
Orabbix监控指标:
- DB版本(即软件包的有效性);
- 归档(带有趋势分析的归档日志生成);
- 事件等待(文件I/O、单块读取、多块读取、直接路径读取、SQLNet消息、控制文件I/O、日志写入);
- 命中率(对触发器、表/过程、SQL区域、主体的命中率);
- 逻辑I/O(服务器在逻辑I/O上的性能:当前读、一致读、块更改);
- 物理I/O(重做写、数据文件写、数据文件读);
- PGA;
- SGA(特别是;固定缓冲区,Java池,大池,日志缓冲区,共享池缓冲缓存);
- 共享池(池字典缓存,池空闲内存,库Chache, SQL区域,MISC);
- 引脚命中率(Oracle库缓存引脚由库缓存争用引起,库缓存是用来存储SQL可执行文件以供重用的区域);
- 会话/过程
- 会话(活动会话、非活动会话、系统会话)
- DBSize/DBFileSize(数据库实际使用空间和文件大小的DBSize)
注:我们无需安装任何类型的Oracle客户端即可使用Orabbix。 Orabbix使用Java对象和连接字符串连接到Oracle数据库,因此不需要在Zabbix服务器上安装Oracle客户端。
2、环境检查
在安装之前需要确保zabbix server端已经安装了JRE环境、可以使用java命令识别。如果没有安装的小伙伴请自行百度安装(这里必须安装低版本的Java、具体原因后面会详细说明)。
没有安装的同学可以通过下面的命令进行安装:
yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 -y
### 3、Orabbix安装
我们首先去zabbix server服务器上创建orabbix插件目录 /opt/orabbix。然后我们去 orabbix 官方网站下载 orabbix 安装包到 /opt/orabbix 目录并解压。下载地址(最新版本orabbix-1.2.3.zip):http://www.smartmarmot.com/product/orabbix/download/ 。解压完成之后我们给 orabbix 目录进行授权
1、创建/opt/orabbix目录
mkdir -p /opt/orabbix
2、下载orabbix安装文件到/opt/目录并解压文件
wget https://jaist.dl.sourceforge.net/project/orabbix/orabbix-1.2.3.zip
3、解压文件到/opt/orabbix
unzip -o orabbix-1.2.3.zip -d /opt/orabbix/
4、拷贝orabbix模板配置文件
cp /opt/orabbix/conf/config.props.sample /opt/orabbix/conf/config.props
5、拷贝orabbix启动文件并授权
cp /opt/orabbix/init.d/orabbix /etc/init.d/
chmod u+x /etc/init.d/orabbix
chmod u+x /opt/orabbix/run.sh
4、增加Oracle用户权限
orabbix的配置先告一段落、我们来给zabbix配置一个Oracle授权用户:
# 创建Oracle监控账号
CREATE USER ZABBIX
IDENTIFIED BY <REPLACE WITH PASSWORD> # 修改为自己的密码(Oracle禁止使用特殊字符)
DEFAULT TABLESPACE SYSTEM
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
# 赋予角色权限
GRANT CONNECT TO ZABBIX;
GRANT RESOURCE TO ZABBIX;
ALTER USER ZABBIX DEFAULT ROLE ALL;
# 赋予系统权限
GRANT SELECT ANY TABLE TO ZABBIX;
GRANT CREATE SESSION TO ZABBIX;
GRANT SELECT ANY DICTIONARY TO ZABBIX;
GRANT UNLIMITED TABLESPACE TO ZABBIX;
GRANT SELECT ANY DICTIONARY TO ZABBIX;
当然、如果你想添加一个最小权限的Oracle授权用户、你也可以进行下面的操作(否则可以忽略):
CREATE USER ZABBIX
IDENTIFIED BY <REPLACE WITH PASSWORD> # 修改为自己的密码(Oracle禁止使用特殊字符)
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
GRANT ALTER SESSION TO ZABBIX;
GRANT CREATE SESSION TO ZABBIX;
GRANT CONNECT TO ZABBIX;
ALTER USER ZABBIX DEFAULT ROLE ALL;
GRANT SELECT ON V_ParseError: KaTeX parse error: Expected group after '_' at position 75: …ANT SELECT ON V_̲LOG_HISTORY TO ZABBIX;
GRANT SELECT ON V_ParseError: KaTeX parse error: Expected group after '_' at position 88: …ANT SELECT ON V_̲LOCK TO ZABBIX;
GRANT SELECT ON DBA_REGISTRY TO ZABBIX;
GRANT SELECT ON V_ParseError: KaTeX parse error: Expected group after '_' at position 42: …ANT SELECT ON V_̲SYSSTAT TO ZABBIX;
GRANT SELECT ON V_ParseError: KaTeX parse error: Expected group after '_' at position 39: …ANT SELECT ON V_̲LATCH TO ZABBIX;
GRANT SELECT ON V_ParseError: KaTeX parse error: Expected group after '_' at position 37: …ANT SELECT ON V_̲SGASTAT TO ZABBIX;
GRANT SELECT ON V_ParseError: KaTeX parse error: Expected group after '_' at position 42: …ANT SELECT ON V_̲PROCESS TO ZABBIX;
GRANT SELECT ON DBA_DATA_FILES TO ZABBIX;
GRANT SELECT ON DBA_TEMP_FILES TO ZABBIX;
GRANT SELECT ON DBA_FREE_SPACE TO ZABBIX;
GRANT SELECT ON V_$SYSTEM_EVENT TO ZABBIX;
注:这里我一直操作失败,在GRANT SELECT ON V_$INSTANCE TO ZABBIX这里提示未知命令、有知道的小伙伴请告诉我一下。
如果你使用的是Oracle 11G或者以上的用户,你还需要做以下操作放开ACL访问控制,否则在监控过程中有部分内容无法显示:
exec dbms_network_acl_admin.create_acl(acl => 'resolve.xml',description => 'resolve acl', principal =>'ZABBIX', is_grant => true, privilege => 'resolve');
exec dbms_network_acl_admin.assign_acl(acl => 'resolve.xml', host =>'*');
commit;
5、配置Orabbix
编辑并修改 orabbix 配置文件 config.props :
# Zabbix服务器配置
#comma separed list of Zabbix servers
ZabbixServerList=ZabbixServer # 修改为自己zabbix服务器的hostname
ZabbixServer.Address=172.16.200.105 # 修改为自己zabbix服务器的IP地址
ZabbixServer.Port=10051 # 修改为自己zabbix服务器的监听端口
# Orabbix守护进程配置
#pidFile
OrabbixDaemon.PidFile=./logs/orabbix.pid # Orabbix Pid 文件路径
#frequency of item's refresh
OrabbixDaemon.Sleep=300 # Orabbix监控的刷新频率
#MaxThreadNumber should be >= than the number of your databases
OrabbixDaemon.MaxThreadNumber=100 # Orabbix的最大线程数量,此线程数量要大于等于数据库数量
# 数据库连接池配置(全局配置)
#put here your databases in a comma separated list
DatabaseList=DB-Server # 指定数据库地址,多个数据库使用英文逗号隔开,此数据库地址需要与数据库机器上的 zabbix_agentd.conf中 Hostname 参数指定的一致
#Configuration of Connection pool
#if not specified Orabbis is going to use default values (hardcoded)
#Maximum number of active connection inside pool
DatabaseList.MaxActive=10 # 数据库连接池中的最大活跃数量(全局参数)
#The maximum number of milliseconds that the pool will wait
#(when there are no available connections) for a connection to be returned
#before throwing an exception, or <= 0 to wait indefinitely.
DatabaseList.MaxWait=100 # 数据库连接池中的最大等待的毫秒数(全局参数)
DatabaseList.MaxIdle=1
# 数据库实例配置
#define here your connection string for each database
DB-Server.Url=jdbc:oracle:thin:@172.16.200.240:1521:ORCL # 因为是通过jdbc连接,所以需要配置jdk环境,IP:端口:数据库实例
DB-Server.User=zabbix # Orabbix监控oracle所用到的账号
DB-Server.Password=12345678 # Orabbix监控oracle所用到的密码
#Those values are optionals if not specified Orabbix is going to use the general values
# 以下几个可对单个数据库进行配置,如果不配置则引用上面的数据库连接池全局配置
DB-Server.MaxActive=10
DB-Server.MaxWait=100
DB-Server.MaxIdle=1
DB-Server.QueryListFile=./conf/query.props # 指定查询SQL文件,由此文件来对oracle tablespace进行查询监控
# 如果有多个数据库需要监控、可以在下面增加配置。当然、上面的DatabaseList也需要进行添加
#DB2.Url=jdbc:oracle:thin:@server2.domain.example.com:<LISTENER_PORT>:DB2
#DB2.User=zabbix
#DB2.Password=zabbix_password
#DB2.QueryListFile=./conf/query.props
#DB3.Url=jdbc:oracle:thin:@server3.domain.example.com:<LISTENER_PORT>:DB3
#DB3.User=zabbix
#DB3.Password=zabbix_password
#DB3.QueryListFile=./conf/query.props
6、添加ojdbc8.jar驱动
orabbix默认使用的是ojdbc6.jar驱动,因为ojdbc6.jar驱动的认证协议对12c的认证协议不匹配,所以这里换成ojdbc8.jar驱动:
ojdbc8.jar管网下载地址:https://www.oracle.com/database/technologies/appdev/jdbc-ucp-183-downloads.html(请选择和自己操作系统对应的版本)
下载完成之后我们把ojdbc8.jar包上传至服务器:
# 把ojdbc8.jar文件移动到/opt/orabbix/lib/下面
mv ojdbc8.jar /opt/orabbix/lib/
# 删除/opt/orabbix/lib/目录下面的默认ojdbc6.jar
rm -rf /opt/orabbix/lib/ojdbc6.jar
# 给ojdbc8.jar授权
chown -Rf root.root /opt/orabbix/lib/ojdbc8.jar
chmod 644 /opt/orabbix/lib/ojdbc8.jar
7、重新编译orabbix-1.2.3.jar
注:这里我卡了很长时间、最后通过下面的方式成功解决。
重点来了:orabbix默认是不支持zabbix4+的,因为orabbix在传输数据的时候在数据包中没有加 Header包头 ,在zabbix4之前版本中zabbix server和zabbix proxy收到的数据包允许不加 Header包头,所以orabbix在zabbix4.0版本之前可以游刃有余的对orabbix监控,但是在zabbix4.0之后由于zabbix官方删除了对纯本文协议的支持(无Header)的支持,官方解释:Header and data length。
所以现在zabbix4.0之后版本必须强制添加 Header包头,对于没有添加 Header包头的数据包,Zabbix Server/Zabbix Proxy将会拒绝此数据报文,哪能怎么办呢,难道不能用orabbix监控oracle了吗? 在github上的一个 isuse 中,给出了解决方法,将重新编译orabbix-1.2.3.jar加入 Header 协议头的支持。 具体操作如下(这里我们必须要使用低版本的java、使用高版本的java编译完成之后会报错的):
# 克隆代码到本地
cd /usr/local/src/
git clone https://github.com/snickerjp/orabbix.git
# 将上面下载的orabbix压缩文件复制到克隆的orabbix目录内
cd orabbix/
cp -rf /opt/orabbix-1.2.3.zip ./
mkdir orabbix-1.2.3
unzip -o orabbix-1.2.3.zip -d orabbix-1.2.3/
#拷贝orabbix-1.2.3.jar和lib库下的jar包到指定文件
javac -cp "orabbix-1.2.3/orabbix-1.2.3.jar:orabbix-1.2.3/lib/*" com/smartmarmot/orabbix/Sender.java
#创建构建目录
mkdir -p ./build
cp orabbix-1.2.3/orabbix-1.2.3.jar ./build
#重新打包orabbix,去刚才创建的build目录下面操作如下
jar -xvf orabbix-1.2.3.jar com
cp ../com/smartmarmot/orabbix/Sender.class com/smartmarmot/orabbix/Sender.class
cp: overwrite `com/smartmarmot/orabbix/Sender.class'? y
jar -uf orabbix-1.2.3.jar com
#将重新打包好的jar包覆盖掉之前的orabbix-1.2.3.jar
cp -rf orabbix-1.2.3.jar /opt/orabbix/orabbix-1.2.3.jar
cp: overwrite `/opt/orabbix/orabbix-1.2.3.jar'? y
8、启动orabbix
接下来我们把orabbix加入开机启动即可、到这里orabbix的安装配置就已经完成了、下面我们去zabbix后台中添加监控项模板:
# 加入开机启动
chkconfig --add orabbix
# 验证开机启动项
chkconfig orabbix on
# 启动orabbix
systemctl start orabbix
# 验证orabbix是否启动
ps aux | grep orabbix
# 这里我们也可以通过下面的命令检查orabbix日志是否报错
tail -f /opt/orabbix/logs/orabbix.log
9、配置监控模板
orabbix给我们提供了已经写好的监控模板文件、模板文件放在安装包的 /opt/orabbix/template 文件目录下面、我们直接把下面的四个监控模板文件导入zabbix即可(注意导入顺序):
- Orabbix_export_full.xml 全部导入(图表 监控项 触发器)
- Orabbix_export_items.xml 监控项
- Orabbix_export_graphs.xml 图表
- Orabbix_export_triggers.xml 触发器
导入完成之后、我们直接添加监控主机、关联Oracle模板(这里就不再详细讲了)。我这里使用的是测试库、没有什么数据、各位小伙伴可以直接忽略了。
10、监控库大小
好了、到这里我们就已经成功通过Orabbix插件监控了Oracle数据库啦。但是现在还有点小问题、orabbix默认情况下未开启数据库大小,我们需要去配置query.props,在proxy上修改/opt/orabbix/conf/query.props。
#在QueryList=类目下增加dbfilesize,dbsize,如图所示:
然后在文件末尾添加对应的SQL语句,其实这是两条SQL语句,语法如下:
- dbfilesize.Query=SQL语句
- dbsize.Query=SQL语句
SQL语句测试
我们可以单纯把SQL语句拿出来,通过Zabbix用户登录Oracle数据库后执行,看能否得到结果,确认无误后再添加到此文件内,测试语句如下:
#dbfilesize测试语句
select to_char(sum(bytes/1024/1024/10), 'FM99999999999999990') retvalue from dba_data_files;
#dbsize测试语句
SELECT to_char(sum( NVL(a.bytes/1024/1024/10 - NVL(f.bytes/1024/1024/10, 0), 0)), 'FM99999999999999990') retvalue
FROM sys.dba_tablespaces d,
(select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select tablespace_name, sum(bytes) 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 NOT (d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY') 2 3 4 5 6 ;
加入语句
加入到query.props语句 加入到query.props中的语句必须要使用 \ 换行符,否则会报错 “Error on DBEnquiry on query=dbfilesize on database=172.16.200.240 Error returned is java.lang.IllegalArgumentException: null value for key ‘dbfilesize’”
dbfilesize.Query=select to_char(sum(bytes/1024/1024/10), 'FM99999999999999990') retvalue from dba_data_files
dbsize.Query=SELECT to_char(sum( NVL(a.bytes/1024/1024/10 - NVL(f.bytes/1024/1024/10, 0), 0)), 'FM99999999999999990') retvalue \
FROM sys.dba_tablespaces d, \
(select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a, \
(select tablespace_name, sum(bytes) 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 NOT (d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY')
添加完成之后我们重启orabbix并查看orabbix日志、然后我们去zabbix就可以看到 DB Size和 DB File Size监控项监控数据库大小和数据库文件大小的图形数据了。
11、监控tablespace使用率
oracle表空间使用率orabix默认是监控的,语句就在 /opt/orabbix/conf/query.props 中,在此文件中搜索 tbl_space ,即可看到对应的SQL:
这个SQL会返回满足93%的表空间信息,而对应这个监控项,orabbix也定义了触发器,因为监控项的返回值是文本,而没有满足条件的记录时返回字符串“none“,所以监控项对应的触发器会检查返回值开头是不是none,如果不是,就报警,这样,用户除了收到预警信息,还能从返回值的具体值中看到具体时哪个表空间快满了。 当然,大部分时间监控项会返回none,所以我们无法画出正常未满的表空间的空间占用时间曲线。只有表空间使用率超过93%时,我们才知道具体的占用情况。
我们也可以把上面的SQL复制出来后,去掉换行符,然后通过Zabbix用户登录Oracle后来进程SQL语法检查。我们可以修改query.props中的表空间阈值为65%,然后使其报警。