我正在尝试使用DBI
(带DBD::Informix
)连接到Informix,只给出一个ip地址和端口号。在这种情况下,我不能依赖机器上的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:无效的数据库环境。 at tools / check_informix.pl第63行
连接到只知道端口和IP地址的Informix服务器的正确方法是什么?
答案 0 :(得分:0)
查看DBD :: Informix的文档,你的方法看起来不错,除了DBD :: Informix的pod只是说// machine1 / dbase并没有提到端口。也许您忘了在您的环境中设置INFORMIXDIR。请参阅CONNECTING TO A DATABASE。
答案 1 :(得分:0)
使用//machine/dbase
的符号主要用于Informix标准引擎,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的主机上的实际服务器名称匹配。
答案 2 :(得分:0)
正如Jonathan Leffler所描述的那样,知道服务器名称(以及REAL服务器名称)是不可避免的。这是一个概念验证脚本,它根据所需信息生成并使用自己的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;