连接到Netezza的RODBC错误:无法打开lib libnzodbc.so文件

时间:2019-09-06 18:51:16

标签: r

我无法在R命令行或Rstudio中连接到Netezza设备。但是,我可以使用isql和nzodbcsql命令行工具连接到设备。

到目前为止,这是我在Redhat Linux中的配置:
1.已安装unixODBC管理器
2.用户环境变量:    

  • LD_LIBRARY_PATH = / usr / local / nz / lib64(存在Netezza库)。目录的权限是755    
  • NZ_ODBC_INI_PATH = / common / odbc,ODBC配置文件所在的位置。此位置的权限也为755。

    3.运行“ odbcinst -j”以检查ODBC文件的配置:

    unixODBC 2.3.4
    DRIVERS............: /common/odbc/odbcinst.ini
    SYSTEM DATA SOURCES: /common/odbc/odbc.ini
    FILE DATA SOURCES..: /common/odbc/ODBCDataSources
    USER DATA SOURCES..: /common/odbc/odbc.ini
    SQLULEN Size.......: 8
    SQLLEN Size........: 8
    SQLSETPOSIROW Size.: 8
    
    1. 能够使用isql和nzodbcsql查询Netezza(从_v_dual中选择*将返回1条记录)。让我们假设ODBC DNS名称为“ testdsn”


    尝试在R会话中使用RODBC:

    library(RODBC)
    z = odbcConnect("testdsn")
    Warning messages:
    1: In RODBC::odbcDriverConnect("DSN=testdsn") :
      [RODBC] ERROR: state 01000, code 0, message [unixODBC][Driver Manager]Can't open lib '/usr/local/nz/lib64/libnzodbc.so' : file not found
    2: In RODBC::odbcDriverConnect("DSN=testdsn") :
      ODBC connection failed
    

    此错误通常表明LD_LIBRARY_PATH设置不正确。我知道虽然我在命令行上设置了它,但没有为R设置它,所以我在Renviron.site配置文件中进行了设置。

    Sys.getenv("LD_LIBRARY_PATH")
    [1] "/lib64:/usr/include:/usr/lib64:/usr/local/nz/lib64"
    

    我还在libnzodbc.so文件上运行了一个ldd,并且没有看到任何链接问题:

    system("ldd /usr/local/nz/lib64/libnzodbc.so")
            linux-vdso.so.1 =>  (0x00007fff1fdce000)
            libc.so.6 => /lib64/libc.so.6 (0x00007f26ede93000)
            libm.so.6 => /lib64/libm.so.6 (0x00007f26edb91000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f26ed975000)
            libdl.so.2 => /lib64/libdl.so.2 (0x00007f26ed771000)
            libkrb5.so.3 => /usr/local/nz/lib64/libkrb5.so.3 (0x00007f26ee58a000)
            libkrb5support.so.0 => /usr/local/nz/lib64/libkrb5support.so.0 (0x00007f26ed664000)
            libcom_err.so.3 => /usr/local/nz/lib64/libcom_err.so.3 (0x00007f26ed561000)
            libk5crypto.so.3 => /usr/local/nz/lib64/libk5crypto.so.3 (0x00007f26ed41e000)
            /lib64/ld-linux-x86-64.so.2 (0x00007f26ee54c000)
            libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f26ed205000)
    

    我可以通过unixODBC和Netezza命令行工具进行查询,但是不能通过R或Rstudio查询。据我所知,我已经正确设置了R环境变量来查找库路径,但是仍然找不到文件。有人知道我是否还有其他东西吗?

    R版本:3.4.4 Netezza驱动程序版本:3.51 Rehat版本:7.6

  • 1 个答案:

    答案 0 :(得分:0)

    我想出了如何使其工作的方法。由于某种原因,R似乎忽略了LD_LIBRARY_PATH中的条目。相反,我使用ldconfig添加了库位置。将它添加到那里并加载(通过运行ldconfig -p验证)后,我便可以在R中进行查询。