【问题标题】:Can't get DBD::ODBC to work with DataDirect ODBC Driver Manager 7.0 - [DataDirect][ODBC lib] Specified driver could not be loaded (SQL-IM003)无法让 DBD::ODBC 与 DataDirect ODBC Driver Manager 7.0 一起使用 - [DataDirect][ODBC lib] 无法加载指定的驱动程序 (SQL-IM003)
【发布时间】:2014-04-03 07:06:39
【问题描述】:

我正在尝试设置 PERL DBD::ODBC 以使用随 Informatica PowerCenter 提供的 DataDirect ODBC 驱动程序管理器 (7.0)。这是在 Solaris 10 Sparc64 环境中。过去我们使用 5.1 驱动程序管理器(在 sp32 服务器上)进行此操作,但现在在迁移到这个新版本后遇到了问题。对于所有 ODBC 连接,我都会收到此错误:

failed: [DataDirect][ODBC lib] Specified driver could not be loaded (SQL-IM003) at test_odbctd.pl line 19
Can't connect to DBI:ODBC:tdedwprd: [DataDirect][ODBC lib] Specified driver could not be loaded (SQL-IM003) at test_odbctd.pl line 19, <STDIN> line 2.

我使用 Informatica 提供的用于测试的“ssgodbc”工具测试了相同的连接,它们可以正常工作。我可以登录并运行查询。

例如,这是我在 odbc.ini 中定义的 Teradata 连接之一(我们在 DB2、SQL Server、Teradata、Sybase、PowerExchange 等方面遇到了同样的问题)。 不要问为什么我必须在这个文件中硬编码完整的驱动程序路径而不是 odbcinst.ini。我无法让它工作,而 Informatica 标准是在 odbc.ini 中对其进行硬编码,因此我不想影响我们对他们的支持。

[tddev]
Driver=/opt/teradata/client/odbc/drivers/tdata.so
Description=Teradata Development
DBCName=teradata1
DBCName2=teradata2
MaxRespSize=65477
DateTimeFormat=AAA
EnableExtendedStmtInfo=No
LoginTimeout=60

驱动程序的ldd输出:

$ ldd /opt/teradata/client/odbc/drivers/tdata.so
warning: ldd: /opt/teradata/client/odbc/drivers/tdata.so: is not executable
        libCstd.so.1 =>  /opt/SUNWspro/lib/v9/libCstd.so.1
        libthread.so.1 =>        /usr/lib/sparcv9/libthread.so.1
        libm.so.1 =>     /usr/lib/sparcv9/libm.so.1
        libw.so.1 =>     /usr/lib/sparcv9/libw.so.1
        libc.so.1 =>     /usr/lib/sparcv9/libc.so.1
        libsocket.so.1 =>        /usr/lib/sparcv9/libsocket.so.1
        libnsl.so.1 =>   /usr/lib/sparcv9/libnsl.so.1
        libxnet.so.1 =>  /usr/lib/sparcv9/libxnet.so.1
        libodbcinst.so =>        /opt/powercenter/v951/ODBC7.0/lib/libodbcinst.so
        libddicu25.so =>         /opt/teradata/client/odbc/lib/libddicu25.so
        libtdparse.so =>         /opt/teradata/client/odbc/lib/libtdparse.so
        libicudatatd.so.46 =>    /usr/lib/sparcv9/libicudatatd.so.46
        libicuuctd.so.46 =>      /usr/lib/sparcv9/libicuuctd.so.46
        libCrun.so.1 =>  /opt/SUNWspro/prod/usr/lib/v9/libCrun.so.1
        libmp.so.2 =>    /lib/64/libmp.so.2
        libmd.so.1 =>    /lib/64/libmd.so.1
        libscf.so.1 =>   /lib/64/libscf.so.1
        libDWicu26.so =>         /opt/powercenter/v951/ODBC7.0/lib/libDWicu26.so
        libdl.so.1 =>    /usr/lib/sparcv9/libdl.so.1
        librt.so.1 =>    /usr/lib/sparcv9/librt.so.1
        libpthread.so.1 =>       /usr/lib/sparcv9/libpthread.so.1
        libdoor.so.1 =>  /lib/64/libdoor.so.1
        libuutil.so.1 =>         /lib/64/libuutil.so.1
        libgen.so.1 =>   /lib/64/libgen.so.1
        libaio.so.1 =>   /lib/64/libaio.so.1
        libm.so.2 =>     /lib/64/libm.so.2
        /lib/sparcv9/../libm/sparcv9/libm_hwcap1.so.2
        /platform/sun4v/lib/sparcv9/libc_psr.so.1
        /platform/sun4v/lib/sparcv9/libmd_psr.so.1

我尝试以使用这些连接的用户身份运行 strace,但出现此错误,因此不知道如何处理:

$ strace perl test_odbctd.pl
ERROR: unable to open /dev/log

这是我们正在使用的 PERL 测试脚本:

#!/usr/bin/perl -w

use DBI;
# use DBD::ODBC;
# use DBD::DB2::Constants;


my $data_source = "DBI:ODBC:tdedwprd";

#Prompt for username
print "Enter user:";
my $user = <STDIN>;

#Prompt for password
print "Enter password:";
my $password =<STDIN>;

# Connect to the tdedwdev teradata database
my $dbh = DBI->connect($data_source, $user, $password, {AutoCommit =>1})
                or die "Can't connect to $data_source: $DBI::errstr";
$stmt = "SELECT database, time; ";
$sth = $dbh->prepare($stmt);
$sth->execute();

#associate variable with output columns...

$sth->bind_col(1,\$db);
$sth->bind_col(2,\$timestap);
while ($sth->fetch) {
           print "The database is: $db\n";
           print "The time is: $timestap\n";
}
$dbh->disconnect;

上述脚本适用于我们现有的开发盒 (Solaris 10 sp32),但不适用于我们正在构建的新开发盒 (Solaris 10 sp64)。

旧服务器的驱动程序管理器与 Informatica PowerCenter 8.6.1 sp32 捆绑在一起,而新服务器具有 Informatica PowerCenter 9.5.1 sp64。

DBD::ODBC 模块经过一些修改后编译良好,大致遵循 DataDirect 的指南(逻辑基本相同,但对 Makefile.PL 的引用并不相同):

http://knowledgebase.datadirect.com/articles/Article/2973

我在 odbc.ini (Trace=1) 中启用了跟踪,但这只会导致“分段错误(核心转储)”。但是,当使用 Informatica 提供的“ssgodbc”工具时,它会输出一个跟踪文件。

我尝试使用 isql,但它似乎与 Sybase 驱动程序绑定,所以我不确定是否可以使用它。我无法让它工作

$ which isql
/opt/sybase/OCS-15_0/bin/isql

这是我的 ODBC 环境变量:

$ env | grep -i odbc
MANPATH=/usr/share/man:/opt/teradata/client/14.00/odbc_32/help/man:
ODBCINST=/opt/powercenter/v951/ODBC7.0/odbcinst.ini
LD_LIBRARY_PATH=/opt/powercenter/v951/ODBC7.0/lib:/opt/powercenter/v951/server/bin:/home/etlin1d/sqllib/lib:/opt/pwx/v851:/opt/sybase/OCS-15_0/lib:/opt/sybase/OCS-15_0/lib3p64:/opt/sybase/OCS-15_0/lib3p:/opt/teradata/client/14.00/tbuild/lib:/opt/teradata/client/odbc/lib:/opt/teradata/client/odbc/drivers:/opt/teradata/client/14.00/tbuild/lib:/usr/lib:/prj/db2/etlin1d/sqllib/lib64:/prj/db2/etlin1d/sqllib/lib32:/usr/lib
LD_LIBRARY_PATH_64=/opt/powercenter/v951/ODBC7.0/lib:/opt/powercenter/v951/server/bin:/opt/pwx/v851:/prj/db2/etlin1d/sqllib/lib64:/opt/sybase/OCS-15_0/lib:/opt/sybase/OCS-15_0/lib3p64:/opt/sybase/OCS-15_0/lib3p:/opt/teradata/client/14.00/tbuild/lib:/opt/teradata/client/odbc/lib:/opt/teradata/client/odbc/drivers:/usr/lib
NLSPATH=/opt/teradata/client/14.00/odbc_64/msg:/opt/teradata/client/14.00/odbc_32/msg:/opt/teradata/client/14.00/tbuild/msg/%N:/opt/teradata/client/14.00/tbuild/msg/%N:/opt/teradata/client/14.00/odbc_32/msg/%N:
PATH=/opt/sybase/ASEP/bin:/opt/sybase/DBISQL/bin:/opt/sybase/UAF-2_0/bin:/opt/sybase/OCS-15_0/bin:/opt/teradata/client/14.00/tbuild/bin:/opt/teradata/client/14.00/tbuild/bin:/usr/bin:/bin:/usr/local/bin:/opt/powercenter/v951/ODBC7.0/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/powercenter/v951/server/bin:.:/prj/db2/etlin1d/sqllib/bin:/prj/db2/etlin1d/sqllib/adm:/prj/db2/etlin1d/sqllib/misc:/prj/db2/etlin1d/sqllib/db2tss/bin
ODBCINI=/opt/powercenter/v951/ODBC7.0/odbc.ini
ODBCHOME=/opt/powercenter/v951/ODBC7.0

我完全不知所措。不过,我不是 Solaris 管理员(事实上,这是我第一次真正接触 Solaris 和 Informatica),所以我希望我遗漏了一些明显的东西。

我不确定现在还可以分享什么。任何帮助将不胜感激。数周以来,我一直被这个 ODBC 实现的问题所困扰。

【问题讨论】:

  • 出于兴趣,你为什么不问问DataDirect?这是他们的司机和您遵循的指示。
  • 由于 DataDirect 软件由 Informatica 提供,我们与 DataDirect 没有支持合同。 Informatica 不会帮助我们,因为它们不支持 PERL。
  • 错误“[DataDirect][ODBC lib] Specified driver could not be loaded”来自 DataDirect,因此据我所知,您的问题出在 DBD::ODBC 中,而不是在 DBD::ODBC 中。我对此的证据是,由于错误来自 DD,因此 DBD::ODBC 必须已成功加载驱动程序管理器。
  • 谢谢博西卡。让我感到困惑的是,我可以使用同一个驱动程序管理器在同一个帐户下使用不同的工具,并且它可以工作。只有 DBD::ODBC 才会失败。有什么东西会影响环境变量,或者 Perl 模块看不到的东西吗?
  • 很抱歉,您使用的专有代码我看不到或掌握,而且您使用的软件的许可证相当严格。我可以告诉你,我认识使用 unixODBC 驱动程序管理器和 teradata ODBC 驱动程序的人。我听说 DD 驱动程序管理器有很多额外的环境和连接句柄属性,这些属性不在 ODBC 中,DBD::ODBC 不会知道,但我只是猜测这可能会导致问题。

标签: perl odbc solaris informatica-powercenter


【解决方案1】:

我意识到这里的问题不在于驱动程序管理器。这是因为我使用的是 32 位 Perl,但使用的是 64 位 ODBC 驱动程序。如果我在odbc.ini 中添加了一个使用 32 位 ODBC 驱动程序的条目(尽管驱动程序管理器是 64 位的),那么就没有问题(尽管它确实引发了与本次讨论不同的许可问题)。

简而言之,出现此错误消息是因为驱动程序与客户端的位数不同(通过对客户端和驱动程序运行file 命令来检查):

 Specified driver could not be loaded

file 命令的示例是:

 file /opt/teradata/client/odbc/drivers/tdata.so

但是,当驱动程序无法找到其所有依赖驱动程序时也会发生这种情况,可以使用驱动程序上的ldd 进行检查,以确保它找到了所有依赖项。

ldd 命令的示例是:

 ldd /opt/teradata/client/odbc/drivers/tdata.so

【讨论】:

    【解决方案2】:

    我尝试了LokMac提供的上述方法,所有依赖的驱动程序都在那里,但仍然无法正常工作,最后我添加了“#驱动程序:安装ODBC驱动程序的位置”。在驱动程序路径之前,它神奇地起作用了:

    [tddemo] 
    # Driver: The location where the ODBC driver is installed to.
    Driver=/opt/teradata/client/16.20/odbc_64/lib/tdataodbc_sb64.so
    

    在上面,tddemo 是我的 DNS 名称,因为我在 TD Express 16.20 上,所以我的驱动程序名称不同。

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 1970-01-01
      • 2016-01-14
      • 2021-10-05
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多