百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

完美指南|如何使用 ODBC 进行无代理 Oracle 数据库监控?

ccwgpt 2024-12-02 16:02 44 浏览 0 评论

张 宇|Zabbix高级认证专家ZCP

  • Zabbix5.0、6.0中文手册官方译者

你是否知道 Zabbix 有一个用于收集 Oracle 数据库指标的开箱即用模板?


使用此模板,我们可以使用 ODBC 无代理地收集数据库、表空间、ASM 和许多其他指标等数据。本文将指导如何为 Oracle 11.2、12.1、18.5 或 19.2 数据库服务器设置 ODBC 监控,将是部署 Oracle 数据库监控的完美指南。

1.下载 Instant 客户端和 SQLPlus

提供的命令适用于以下操作系统:CentOS 8、Oracle Linux 8 或 Rocky Linux。

首先我们要下载以下包:

oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm

oracle-instantclient19.12-sqlplus-19.12.0.0.0-1.x86_64.rpm

oracle-instantclient19.12-odbc-19.12.0.0.0-1.x86_64.rpm

我们在这里下载


Oracle 即时客户端——需要,建立与 Oracle 数据库的连接 SQLPlus——我们可以用来测试与 Oracle 数据库的连接的工具 Oracle ODBC 包——包含所需的 ODBC 驱动程序和配置脚本,以启用与 Oracle 数据库的 ODBC 连接

将包上传到 Zabbix 服务器(或代理,如果您希望在代理上监控您的 Oracle DB)并将其放置在:

/tmp/oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm
/tmp/oracle-instantclient19.12-sqlplus-19.12.0.0.0-1.x86_64.rpm
/tmp/oracle-instantclient19.12-odbc-19.12.0.0.0-1.x86_64.rpm

2.解决操作系统依赖

安装“libaio”和“libnsl”库:

dnf -y install libaio-devel libnsl

否则,我们会收到错误:

# rpm -ivh /tmp/oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm
error: Failed dependencies:
        libaio is needed by oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64
        libnsl.so.1()(64bit) is needed by oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64
# rpm -ivh /tmp/oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm
error: Failed dependencies:
        libnsl.so.1()(64bit) is needed by oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64

检查之前是否已在系统上部署了 Oracle 组件。下面的命令应该提供一个空的输出:

rpm -qa | grep oracle
ldconfig -p | grep oracle

3.安装 Oracle 客户端

rpm -ivh /tmp/oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm

确保安装了包“oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64”:

rpm -qa | grep oracle

4.LD配置

git.zabbix.com 上的官方 Oracle 模板页面讨论了为服务配置 Oracle ENV Usage 的方法。对于这种即时客户端的版本19.12,这是不REQUIRED营造“的/ etc / SYSCONFIG / ZABBIX服务器”的内容文件:

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

虽然我们确实安装了 rpm 包,但 Oracle 19.12 客户端包确实在全局级别自动配置了 LD 路径——这意味着系统上的每个用户都可以使用 Oracle 即时客户端。我们可以看到 LD 路径已经配置在:

cat /etc/ld.so.conf.d/oracle-instantclient.conf

显示结果:

/usr/lib/oracle/19.12/client64/lib

为确保操作系统识别所需的 Oracle 库,我们可以运行:

ldconfig -p | grep oracle

正确的显示:

liboramysql19.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/liboramysql19.so
libocijdbc19.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libocijdbc19.so
libociei.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libociei.so
libocci.so.19.1 (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libocci.so.19.1
libnnz19.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libnnz19.so
libmql1.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libmql1.so
libipc1.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libipc1.so
libclntshcore.so.19.1 (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libclntshcore.so.19.1
libclntshcore.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libclntshcore.so
libclntsh.so.19.1 (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libclntsh.so.19.1
libclntsh.so (libc6,x86-64) => /usr/lib/oracle/19.12/client64/lib/libclntsh.so

**注意:**如果由于某种原因 ldconfig 命令显示到其他动态库的链接 - 那是我们可能必须为 Zabbix 服务器/代理创建单独的 ENV 文件,它将 Zabbix 应用程序链接到正确的动态库,如示例所示本节的开始。

5.检查Oracle服务端口是否可达

为我们以后省掉一些麻烦,首先检查与 Oracle 数据库主机的网络连接。检查是否可以在网络级别访问默认的 Oracle 端口。在本例中,我们将尝试连接到默认的 Oracle 数据库端口 1521。根据您的 Oracle 数据库正在侦听连接的端口,进行相应的调整。确保输出显示“已连接到 10.1.10.15:1521”:

nc -zv 10.1.10.15 1521

6.测试与 SQLPlus 的连接

在继续进行 ODBC 配置之前,我们可以模拟与 Oracle 数据库的连接。确保命令中使用的 Oracle 用户名和密码正确。对于此任务,我们首先需要安装 SQLPlus 包。:

rpm -ivh /tmp/oracle-instantclient19.12-sqlplus-19.12.0.0.0-1.x86_64.rpm

为了模拟连接,我们可以使用单行命令。在示例命令中,我使用用户名“system”和密码“oracle”通过端口“1521”访问 Oracle 数据库服务器“10.1.10.15”并连接到服务名称“xe”:

sqlplus64 'system/oracle@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.10.15)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=xe)))'

在输出中我们可以看到:我们使用 19.12 客户端连接到 11.2 服务器:

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Sep 6 13:47:36 2021
Version 19.12.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

**注意:**这为我们提供了有关 Oracle 即时客户端的额外提示——新版本的客户端向后兼容旧版本的 Oracle 数据库服务器。尽管这不适用于 Oracle 客户端/服务器的每个版本,但请先查看 Oracle 即时客户端文档。

7.ODBC 连接器

说到配置ODBC,我们先安装ODBC驱动管理器

dnf -y install unixODBC

现在我们可以看到我们有两个新文件——“/etc/odbc.ini”(可能是空的)和“/etc/odbcinst.ini”。文件“/etc/odbcinst.ini”描述了驱动程序关系。目前,当我们'grep'关键字'oracle'时没有安装oracle关系,当我们运行时输出为空:

grep -i oracle /etc/odbcinst.ini

我们的下一步是安装 Oracle ODBC 驱动程序包:

rpm -ivh /tmp/oracle-instantclient19.12-odbc-19.12.0.0.0-1.x86_64.rpm

'oracle-instantclient*-odbc' 包包含一个脚本,将自动更新 '/etc/odbcinst.ini' 配置:

cd /usr/lib/oracle/19.12/client64/bin
./odbc_update_ini.sh / /usr/lib/oracle/19.12/client64/lib

显示结果:

 *** ODBCINI environment variable not set,defaulting it to HOME directory!

现在当我们在屏幕上打印文件时:

cat /etc/odbcinst.ini

我们会看到在文件末尾添加了 Oracle 19 ODBC 驱动部分:

[Oracle 19 ODBC driver]
Description     = Oracle ODBC driver for Oracle 19
Driver          = /usr/lib/oracle/19.12/client64/lib/libsqora.so.19.1
Setup           =
FileUsage       =
CPTimeout       =
CPReuse         =

在执行“ldd”命令时,检查输出中是否没有错误很重要。这确保了依赖项得到满足且可访问,并且与库版本控制没有冲突:

ldd /usr/lib/oracle/19.12/client64/lib/libsqora.so.19.1

它会打印类似的东西:

linux-vdso.so.1 (0x00007fff121b5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb18601c000)
libm.so.6 => /lib64/libm.so.6 (0x00007fb185c9a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb185a7a000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fb185861000)
librt.so.1 => /lib64/librt.so.1 (0x00007fb185659000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007fb185456000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fb18523f000)
libclntsh.so.19.1 => /usr/lib/oracle/19.12/client64/lib/libclntsh.so.19.1 (0x00007fb1810e6000)
libclntshcore.so.19.1 => /usr/lib/oracle/19.12/client64/lib/libclntshcore.so.19.1 (0x00007fb180b42000)
libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007fb18092c000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb180567000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb1864da000)
libnnz19.so => /usr/lib/oracle/19.12/client64/lib/libnnz19.so (0x00007fb17fdba000)
libltdl.so.7 => /lib64/libltdl.so.7 (0x00007fb17fbb0000)

当我们执行“odbc_update_ini.sh”脚本时,在“/root/.odbc.ini”中创建了一个新的DSN(数据源名称)文件。这是一个示例配置 ODBC 配置文件,它描述了此版本的 ODBC 驱动程序支持哪些设置。

让我们将此配置文件从用户目录移动到系统范围内可访问的位置:

cat /root/.odbc.ini | sudo tee -a /etc/odbc.ini

并从用户目录中完全删除该文件:

rm /root/.odbc.ini

这样,系统中的每个用户都将只使用这个 ODBC 配置文件。我们现在可以更改现有配置 – /etc/odbc.ini。我要突出显示从默认值更改的内容:

[Oracle11g]
AggregateSQLType = FLOAT
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CacheBufferSize = 20
CloseCursor = F
DisableDPM = F
DisableMTS = T
DisableRULEHint = T
Driver = Oracle 19 ODBC driver
DSN = Oracle11g
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
LobPrefetchSize = 8192
Lobs = T
Longs = T
MaxLargeData = 0
MaxTokenSize = 8192
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
ServerName = //10.1.10.15:1521/xe
SQLGetData extensions = F
SQLTranslateErrors = F
StatementCache = F
Translation DLL =
Translation Option = 0
UseOCIDescribeAny = F
UserID = system
Password = oracle

DSN – 数据源名称。应该匹配括号中的部分名称,例如:[Oracle11g] ServerName – Oracle 服务器地址 UserID – Oracle 用户名 Password – Oracle 用户密码

要从命令行测试连接,让我们使用 isql 命令行工具,该工具应该模拟 ODBC 连接,类似于 Zabbix 在收集指标时正在执行的操作:

isql -v Oracle11g

本示例中的 isql 命令从 odbc.ini 文件中选取 ODBC 设置(用户名、密码、服务器地址)。我们所要做的就是引用特定的 DSN – Oracle11g

另一方面,如果我们不想在文件系统 (/etc/odbc.ini) 上保留密码,我们可以删除“UserID”和“Password”行。然后我们可以测试 ODBC 连接:

isql -v Oracle11g 'system' 'oracle'

如果连接成功,它应该打印:这就是 ODBC 配置!现在我们应该可以在 Zabbix 中应用 Oracle by ODBC 模板了

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

不要忘记,我们还需要提供必要的 Oracle 凭证来开始收集 Oracle 数据库指标:

在这篇博文中学到的经验教训可以很容易地应用于一般的 ODBC 监控和故障排除,而不仅仅是 Oracle。如果您有任何问题或希望分享您在 ODBC 或 Oracle 数据库监控方面的经验——欢迎投稿分享,有偿!


-------------- --------------


第1场Zabbix6.0ZCU培训报名开启!


K8s、API、日志、prometheus,下半年课表更新!扫码学习!


往期推荐

Z投稿|Zabbix如何通过ODBC对接Oracle获取相关数据?

案例|光大银行如何解决传统监控痛点,打造一体化监控平台?

Zabbix全年在线课录屏

PDF手册|1666页 Zabbix6.0官方中文 操作手册PDF下载!

扫一扫|加入技术交流群

微信号|17502189550

备注“使用Zabbix年限+企业+姓名”

5000+用户已加入!

一个人走得快,一群人走得远

相关推荐

迈向群体智能 | 智源发布首个跨本体具身大小脑协作框架

允中发自凹非寺量子位|公众号QbitAI3月29日,智源研究院在2025中关村论坛“未来人工智能先锋论坛”上发布首个跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain,可实...

大模型对接微信个人号,极空间部署AstrBot机器人,万事不求百度

「亲爱的粉丝朋友们好啊!今天熊猫又来介绍好玩有趣的Docker项目了,喜欢的记得点个关注哦!」引言前两天熊猫发过一篇关于如何在极空间部署AstrBot并对接QQ消息平台的文章,不过其实QQ现在已经很少...

Seata,让分布式事务不再是难题!实战分享带你领略Seata的魅力!

终身学习、乐于分享、共同成长!前言Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的...

常见分布式事务解决方案(分布式事务解决的问题)

1.两阶段提交(2PC)原理:分为准备阶段(协调者询问参与者是否可提交)和提交阶段(协调者根据参与者反馈决定提交或回滚)。优点:强一致性,适用于数据库层(如XA协议)。缺点:同步阻塞:所有参与者阻塞...

分布式事务:从崩溃到高可用,程序员必须掌握的实战方案!

“支付成功,但订单状态未更新!”、“库存扣减后,交易却回滚了!”——如果你在分布式系统中踩过这些“天坑”,这篇文章就是你的救命稻草!本文将手把手拆解分布式事务的核心痛点和6大主流解决方案,用代码实战+...

谈谈对分布式事务的一点理解和解决方案

分布式事务首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下:项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要...

一篇教你通过Seata解决分布式事务问题

1 Seata介绍Seata是由阿里中间件团队发起的开源分布式事务框架项目,依赖支持本地ACID事务的关系型数据库,可以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题,目前提供AT...

Seata分布式事务详解(原理流程及4种模式)

Seata分布式事务是SpringCloudAlibaba的核心组件,也是构建分布式的基石,下面我就全面来详解Seata@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合...

分布式事务最终一致性解决方案有哪些?MQ、TCC、saga如何实现?

JTA方案适用于单体架构多数据源时实现分布式事务,但对于微服务间的分布式事务就无能为力了,我们需要使用其他的方案实现分布式事务。1、本地消息表本地消息表的核心思想是将分布式事务拆分成本地事务进行处理...

彻底掌握分布式事务2PC、3PC模型(分布式事务视频教程)

原文:https://mp.weixin.qq.com/s/_zhntxv07GEz9ktAKuj70Q作者:马龙台工作中使用最多的是本地事务,但是在对单一项目拆分为SOA、微服务之后,就会牵扯出分...

Seata分布式事务框架关于Annotation的SAGA模式分析

SAGAAnnotation是ApacheSeata版本2.3.0中引入的功能,它提供了一种使用Java注解而不是传统的JSON配置或编程API来实现SAGA事务模式的声明...

分布式事务,原理简单,写起来全是坑

今天我们就一起来看下另一种模式,XA模式!其实我觉得seata中的四种不同的分布式事务模式,学完AT、TCC以及XA就够了,Saga不好玩,而且长事务本身就有很多问题,也不推荐使用。S...

内存空间节约利器redis的bitmap(位图)应用场景有哪些你知道吗

在前面我们分享过一次Redis常用数据结构和使用场景,文章对Redis基本使用做了一个简单的API说明,但是对于其中String类型中的bitmap(位图)我们需要重点说明一下,因为他的作用真的不容忽...

分布式事务原理详解(图文全面总结)

分布式事务是非常核心的分布式系统,也是大厂经常考察对象,下面我就重点详解分布式事务及原理实现@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc分布式事务分布式事务指的是...

大家平时天天说的分布式系统到底是什么东西?

目录从单块系统说起团队越来越大,业务越来越复杂分布式出现:庞大系统分而治之分布式系统所带来的技术问题一句话总结:什么是分布式系统设计和开发经验补充说明:中间件系统及大数据系统前言现在有很多Java技术...

取消回复欢迎 发表评论: