通过 ip:port 使用 Perl DBI 连接到 Informix
Posted
技术标签:
【中文标题】通过 ip:port 使用 Perl DBI 连接到 Informix【英文标题】:Connecting to Informix with Perl DBI by ip:port 【发布时间】:2012-02-17 18:28:18 【问题描述】:我正在尝试使用DBI
(与DBD::Informix
)连接到仅给定IP 地址和端口号的Informix。在这种情况下,我不能依赖机器上的 sql hosts 文件是准确的。我正在做的事情可能吗?
在文档中,他们提到了//machine1/dbase
形式的连接字符串,所以我试了一下:
DBI->connect("dbi:Informix://10.1.23.232:2232/eris", $user, $pass);
但收到以下错误:
DBI connect('//10.1.23.232:2232/eris','someuser',...) 失败:SQL:-1804:数据库环境无效。在工具/check_informix.pl 第 63 行
连接到只知道端口和 IP 地址的 Informix 服务器的正确方法是什么?
【问题讨论】:
【参考方案1】:使用//machine/dbase
的符号主要用于Informix Standard Engine, SE(我相信即使在那时也不会识别:port
符号;我必须研究以找出使用了哪个端口,但是可能是 1525 或 1526)。 AFAIK,它不适用于 Informix Dynamic Server、IDS。需要在 sqlhosts 文件中为服务器名创建一个条目,其中指定机器(原始 I/P 地址 OK)和端口(原始端口号 OK),例如:
myremoteserver olsoctcp 10.1.23.232 2232
然后您可以将连接字符串指定为:
eris@myremoteserver
您可以使用 INFORMIXSQLHOSTS 变量将任何文件指定为 sqlhosts 文件。您在 sqlhosts 文件中指定的服务器名称必须与正在侦听端口 2232 的 I/P 地址为 10.1.23.232 的主机上的实际服务器名称匹配。
【讨论】:
谢谢!我提交需要接受一个服务器名称。我创建了一个临时主机文件(使用 File::Temp)并将 INFORMIXSQLHOSTS 更改为指向它。有什么办法可以避免摆弄环境变量或写入文件系统?【参考方案2】:查看 DBD::Informix 的文档,您的方法看起来不错,除了 DBD::Informix 的 pod 只是说 //machine1/dbase 并且没有提及端口。也许您忘记在您的环境中设置 INFORMIXDIR。见CONNECTING TO A DATABASE。
【讨论】:
【参考方案3】:正如 Jonathan Leffler 所描述的,知道服务器名称(以及真实的服务器名称)是不可避免的。这是一个概念验证脚本,它根据所需的信息生成并使用它自己的 sqlhosts 文件。
#!/usr/bin/env perl
use strict;
use warnings;
use 5.10.0;
# core
use File::Temp qw(tempfile);
# CPAN
use DBI;
die "Usage: $0 host port server database user password\n" if (@ARGV != 6);
my ($host, $port, $server, $database, $user, $password) = @ARGV;
my ($handle, $path) = tempfile("sqlhosts_$server\_XXXXX");
print $handle "$server onsoctcp $host $port\n";
close($handle);
my $sqlhosts = File::Spec->rel2abs($path);
$ENV'INFORMIXSQLHOSTS' = $sqlhosts;
$ENV'INFORMIXSERVER' = $server;
my $dbh = DBI->connect("dbi:Informix:$database\@$server", $user, $password);
say 'Yay! It worked!';
$dbh->disconnect();
unlink $sqlhosts;
【讨论】:
以上是关于通过 ip:port 使用 Perl DBI 连接到 Informix的主要内容,如果未能解决你的问题,请参考以下文章
在Perl的DBI连接方法中设置keepalive的任何方法
为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?
在 Perl 中使用 DBI 连接到 Oracle 数据库,在 Windows 中出现 ERROR OCIEnvNlsCreate