【问题标题】:Error ORA-12154 on DBI->connect to Oracle database with Oracle Instant Client in Solaris 10DBI 上的 ORA-12154 错误->在 Solaris 10 中使用 Oracle Instant Client 连接到 Oracle 数据库
【发布时间】:2013-04-19 23:33:24
【问题描述】:

这两天我一直在纠结这个问题:

我正在尝试获取一个 perl 脚本来与 Oracle 数据库交互。我有一个新服务器,我想在上面部署我的应用程序。该脚本以前有效。

这是我到目前为止所做的:

将我的 tnsnames.ora 文件放在 Instantclient/network/admin 中:

ls -la network/admin/
total 8
drwxrwxrwx   2 m staff        512 Apr 19 09:54 .
drwxrwxrwx   3 m staff        512 Mar 28 15:56 ..
-rwxrwxrwx   1 m staff        777 Apr 19 09:54 tnsnames.ora

我的 Perl 脚本如下所示:

  12 use CGI;
   13 use DBI;
   14 use Data::Dumper;
   15 use strict;
   16 
   28 $ENV{ORACLE_HOME} = "/xxx/instantclient/";
   29 
   32 $ENV{'LD_LIBRARY_PATH'} = "xxx/instantclient/lib";
   33 
   35 use DBD::Oracle;
   36 
   37 print "DBI::VERSION: $DBI::VERSION\n";
   38 print "$DBD::Oracle::VERSION\n";
   66 my $dbh = DBI->connect("dbi:Oracle:host=computer;port=1521;sid=mydatabase", "user", "pass");
   67 my $sth = $dbh->prepare("SELECT sysdate FROM dual");
   68 my $rv = $sth->execute; 
   69 DBI::dump_results($sth) if $rv;
   70 $dbh->disconnect;
   71 
   72 print "$database $dbUser $dbPassword \n";
   73 
   74 my $dbh = DBI->connect( $database, $dbUser, $dbPassword ) or die("PROBLEM WITH LINE:\n$! , stopped");

这个脚本产生这个输出:

DBI::VERSION: 1.609
DBD::Oracle version: 1.24
'19-APR-13'
1 rows
dbi:Oracle:mydatabase user pass 
DBI connect('mydatabase','user',...) failed: ORA-12154: TNS:could not resolve the connect identifier specified (DBD ERROR: OCIServerAttach) at ./code.pl line 74

我的 tnsnames.ora 文件包含以下条目:

mydatabase =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = computer )(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = service.computer.com)
    )
  )

这个 tnsnames.ora 文件是从一台正常工作的机器上复制的,所以我相信它可以工作。

奇怪的是,我可以不使用 tnsnames.ora 文件连接到代码,但是当我尝试使用它时,它会中断。

有什么建议吗?

【问题讨论】:

  • 我遇到了同样的问题,没有答案,但我想添加一些额外的注释。首先,我在使用 ldap.ora 时遇到了同样的问题。我假设然后名称解析不正确。网上的注释说 DBI 应该使用与 SQL*Net 相同的分辨率。似乎也有一些迹象表明 64 位/32 位 oracle 与 perl 不匹配可能会导致此问题,但我似乎没有成功切换驱动程序。
  • 此外,该名称在 toad 内部有效,并引用包含 ldap.ora 和 sqlnet.ora 的同一即时客户端目录。

标签: perl oracle11g dbi solaris-10 tnsnames


【解决方案1】:

不确定是否有帮助,但以下对我有用:

使用 tnsnames.ora 本地连接(在 $ORACLE_HOME/network/admin 目录内):

my $db = DBI->connect( "dbi:Oracle:mydatabase", "scott", "tiger" );

并且不使用 tnsnames.ora 进行连接:

my $db = DBI->connect("dbi:Oracle:host=$host;sid=$sid;port=1521",$user,$passwd)
    || die( $DBI::errstr . "\n" );

$host, $sid 必须事先定义。

【讨论】:

    【解决方案2】:

    这是一个旧帖子,但问题通常是连接问题。要解决此问题,您需要确保在端口 1521 上允许从客户端到服务器端的连接。您可以通过在客户端“telnet 1521”上发出此命令来执行测试 您应该会收到一个指示连接成功的空白屏幕进入数据库。否则,路径之间存在 ACL 或防火墙阻塞端口 1521。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多