Perl 中的 Informix 错误:ISAM:107:ISAM 错误:记录被锁定。在 test_db_connectivity.pl 第 14 行

Posted

技术标签:

【中文标题】Perl 中的 Informix 错误:ISAM:107:ISAM 错误:记录被锁定。在 test_db_connectivity.pl 第 14 行【英文标题】:Informix error in Perl: ISAM: 107: ISAM error: record is locked. at test_db_connectivity.pl line 14 【发布时间】:2015-08-28 19:29:53 【问题描述】:

我正在尝试在我们的生产环境中连接到我们的数据库。我收到 107 ISAM 错误:记录已锁定。我已经检查了各种关于它可能是什么的文章,但没有运气。我与我们的 DBA 仔细检查了数据库详细信息,并且信息正确。

仅供参考 - 我收到的“记录已锁定”错误之前的第一个错误是 SQL: -931: Cannot locate web1_tcp service/tcp service in /etc/services.在 test_db_connectivity.pl 第 13 行。。我与我们的 SA 合作将其输入,并且不再出现。任何人都可以提供有关 ISAM 107 错误的任何指导吗?我的连接字符串错了吗?不应该有锁,因为我什至没有打开与数据库的连接。

test_db_connectivity.pl:

#/usr/bin/perl -w

use DBI;
use strict;
use DBI qw(:sql_types);
use DBD::Informix qw(:ix_types);

    my $driver = "Informix";
    my $database = "web1";
    my $dsn = "DBI:$driver:dbname=$database";
    my $userid = "user";
    my $password = "password";
    print "I got this far!\n";
    my $dbh = DBI->connect($dsn, $userid, $password, RaiseError => 1) or      die $DBI::errstr;
    print "Opened db successfully\n";
    $dbh->disconnect();

部分变量设置:

export INFORMIXDIR=/opt/informix

export   LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INFORMIXDIR/lib:$INFORMIXDIR/lib/cli:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib/tools

export INFORMIXSERVER=web1

INFORMIX SQLHOSTS 文件:

#dbservername 网络类型主机名服务名选项

web1 onsoctcp 10.199.***.* web1dev1_tcp

等/服务文件:

web1dev1_tcp 1533/tcp # 分配给数据库的端口

virtual-places 1533/tcp #Virtual Places 软件

web1dev1_tcp 1533/udp # 分配给数据库的端口

【问题讨论】:

这是在 VM 主机上。所以这将是一个远程连接。是否有不同的格式可以做到这一点? 【参考方案1】:

在 Linux 上,出现系统错误 107:

107 (ENOTCONN): Transport endpoint is not connected

很难将其与 C-ISAM 错误 107 区分开来(编号相同)。但是,在上下文中,我认为 ENOTCONN 更可能是问题而不是

ISAM ERROR 107: record is locked.

我观察到您在 $dsn 中使用 DBD::Informix 不测试的符号:

my $dsn = "DBI:$driver:dbname=$database";

其中的dbname= 部分不正确。你应该使用:

my $dsn = "DBI:$driver:$database";

请注意,DBI 规范(当我上次查看时)说驱动程序名称后面的内容是特定于驱动程序的。您可以提交增强请求。

但是,在我的工作系统上,当我使用 dbname=stores 表示法时,我得到的错误是:

DBI connect('dbname=stores', '',...) failed: SQL: -354: Incorrect database or cursor name format. at dbname-dsn.pl line 8.

那是完全不同的。你说你得到了:

SQL: -931: 在 /etc/services 中找不到 web1_tcp 服务/tcp 服务。在 test_db_connectivity.pl 第 13 行

错误信息非常明确。您需要在/etc/services 中输入一个条目,例如:

web1_tcp    9088/tcp

目前,您没有这样的条目,因此甚至没有尝试连接,更不用说成功了。

【讨论】:

谢谢。由于某种原因,我无法 *** 到我的桌面,我会在我能重新登录后立即尝试此操作。是的,我与我们的 SA 合作修复了错误消失的 /etc/services 部分。当我可以重新登录时会尝试您的建议。 好的,改成"my $dsn = "DBI:$driver:$database";"当在 Linux 主机上以 root 身份运行脚本时,它仍然给我同样的错误“107 ISAM 错误:记录已锁定”。完整的错误是:“尝试连接到数据库服务器 (web1) 失败 107 ISAM 错误:记录已锁定。” 您是否还会收到 -931 错误?还是已经改变了?问题可能仍然是连接设置 - 除非您之前已经从这台机器连接到此数据库(但如果是这样,您使用了哪些设置,以及哪些软件?)。要调试它,我需要查看sqlhosts 文件(通常是$INFORMIXDIR/etc/sqlhosts)中的相关条目,并且我需要了解涉及哪些机器,以及客户端(Perl)软件在哪里运行,并且Informix 服务器在哪里运行,等等。您是否在这台机器上构建了 DBD::Informix? 是的。我与 SA 合作修复了 -931 错误,之前是在 *** 上发表这篇文章。 SA 完成后,我运行我的脚本并得到 ISAM 107 错误。不,这是我们正在构建的新虚拟机。好的,谢谢我已经发布了上面的 sqlhosts 文件和 etc/services 文件。是的,Perl 正在当前主机 sandbox-prod-supt 上运行。是的,我们在同一台主机上构建了 DBD:Informix 模块。这是我们第一次在这台机器上设置任何数据库连接。不确定端口是否有问题? 这会引起麻烦——修复它做得很好。

以上是关于Perl 中的 Informix 错误:ISAM:107:ISAM 错误:记录被锁定。在 test_db_connectivity.pl 第 14 行的主要内容,如果未能解决你的问题,请参考以下文章

informix错误代码小结

informix错误代码小结

通过 perl 在 sqlhosts 中的 Informix dbserver 连接

如何从 Perl 调用 Informix 存储过程?

使用 perl 阻止消息在 unix 平台上的 informix 中显示

通过 ip:port 使用 Perl DBI 连接到 Informix