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


    张 宇|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
    
    • 1
    • 2
    • 3

    2.解决操作系统依赖
    安装“libaio”和“libnsl”库:

    dnf -y install libaio-devel libnsl
    
    • 1

    否则,我们会收到错误:

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    rpm -qa | grep oracle
    ldconfig -p | grep oracle
    
    • 1
    • 2

    3.安装 Oracle 客户端

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

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

    rpm -qa | grep oracle
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4

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

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

    显示结果:

    /usr/lib/oracle/19.12/client64/lib
    
    • 1

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

    ldconfig -p | grep oracle
    
    • 1

    正确的显示:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    nc -zv 10.1.10.15 1521
    
    • 1

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

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

    为了模拟连接,我们可以使用单行命令。在示例命令中,我使用用户名“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)))'
    
    • 1

    在输出中我们可以看到:我们使用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

    dnf -y install unixODBC
    
    • 1

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

    grep -i oracle /etc/odbcinst.ini
    
    • 1

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

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

    ‘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
    
    • 1
    • 2

    显示结果:

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

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

    cat /etc/odbcinst.ini
    
    • 1

    我们会看到在文件末尾添加了 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         =
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    它会打印类似的东西:

    l

    inux-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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

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

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

    rm /root/.odbc.ini
    
    • 1

    这样,系统中的每个用户都将只使用这个 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    不要忘记,我们还需要提供必要的 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+用户已加入!

    在这里插入图片描述

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

  • 相关阅读:
    python疑难杂症(10)---Python函数def的定义分类,包括内置函数、外置函数、匿名函数、闭包函数、生成器函数等
    元器件正反(极性)检测案例
    Xilinx ISE系列教程(5):查看模块级资源占用率和综合报告
    cleanmyMac有必要吗,什么软件可以替代clean my mac
    【Redis】基础数据结构-skiplist跳跃表
    手撕前端面试题【JavaScript】
    区块链正在开启一场回归商业,融合商业的新发展
    牛客算法题:B-装进肚子
    5.2 Redis面试题
    elementui 菜单选中优化
  • 原文地址:https://blog.csdn.net/Zabbix_China/article/details/126009735