我正在尝试设置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)中启用了Trace,但这只是导致了“Segmentation Fault(core dumped)”。但是,在使用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实现的问题。
答案 0 :(得分:0)
我意识到这里的问题不在于司机经理。这是因为我使用的是32位Perl但是使用的是64位ODBC驱动程序。如果我添加了一个使用32位ODBC驱动程序到odbc.ini
的条目(尽管驱动程序管理器是64位),那么没有问题(虽然它确实引发了许可问题,这与本讨论是分开的)。
简而言之,出现此错误消息是因为驱动程序与客户端不是 bitness (通过对客户端和驱动程序运行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
答案 1 :(得分:0)
我尝试了LokMac提供的上述方法,所有相关的驱动程序都在那儿,但仍然无法正常工作,最后我添加了“#Driver: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,所以这是我的驱动程序名称不同的原因。