【问题标题】:Oracle 11 instant client connect to remote Oracle 8i server: ORA-12514 errorOracle 11 即时客户端连接到远程 Oracle 8i 服务器:ORA-12514 错误
【发布时间】:2012-08-23 12:27:39
【问题描述】:

我遇到了一个问题,我花了好几个小时来解决它。问题来了:

我正在尝试使用 Oracle 11 即时客户端 连接到远程 Oracle 8i 服务器:这是我在 PHP 中的连接字符串:

$conn = oci_connect('db_user', 'db_pass', "db_ip/db_service");

db_ip为服务器的ip,如“12.34.56.78”。
db_service 为服务器的服务,如“test”。

显示的错误是

ORA-12514: TNS:listener 目前不知道连接描述符中请求的服务

我可以使用同一个客户端连接到另一个 Oracle 10g 服务器。 php 代码是一样的,只是改变 db_user 或 db_pass 或 db_ip。未提供 db_service。

我不将 tnsnames.ora 用于 oracle 10g 服务器或 oracle 8i 服务器。我只是使用服务器的简单IP。这有关系吗?

Server using: Windows Server 2008 R2
PHP: php 5.2.17
Oracle Instant Client: 11_2

任何想法都会受到赞赏。

更新 php现在也可以工作了。我的 php 文件夹在 Programfiles (x86) 下,括号是不允许的。所以我将整个文件夹移动到 C:\php,并配置 IIS 以更改 php 版本。参考:http://stackoverflow.com/questions/9215983/php-cant-connect-but-sqlplus-can

更新 非常感谢贾斯汀的帮助。有用!!!我只是将 sid 更改为 scblive 而不是 SCBLIVE。他们的数据库名称是 scblive。我还在用10.2.0.1,用sqlplus,可以同时连接oracle 10g和oracle 8i。太感谢了!!

这是适用于 oracle 8i 的 tns 名称:

scblive = (描述= (地址 = (协议 = TCP)(主机 = [oracle 8i ip])(端口 = 1521)) (连接数据 = (服务器 = 专用) (SID = scblive) ) )

发现另一个问题,在 php 代码中,无论是 oracle 10g 还是 oracle 8i,它都显示相同的错误。

ORA-12154: TNS: 无法解析指定的连接标识符

我刚刚使用了以下连接字符串:

$conn = oci_connect('user_name', 'pass', 'scblive');

对于oracle 10g,如果我使用与之前相同的连接字符串,错误仍然显示:

$conn = oci_connect('user_name', 'pass', [oracle 10g ip]);

有什么想法吗?

早期更新: 感谢@Justin 的帮助。尝试了 10.2.0.5、10.2.0.4 或 10.1.0.0,它们都无法工作。我看到了矩阵。似乎即时客户端 8.1.7 或即时客户端 9.0.1 可以同时适用于 oracle 10g 和 oracle 8i。有没有人有这些文件的链接? Oracle 只能提供 10.1.0.5 及更高版本。

【问题讨论】:

  • 请注意,10.2.0.5 是在 Windows Server 2008 R2 服务器上工作的 Oracle 客户端的第一个版本(必须向后移植该支持——最初的目的是不支持 10.2 客户端) Windows 2008 R2)。如果您需要早期版本的 Oracle 客户端,则需要在服务器上安装不同版本的 Windows。然后,您可以向 Oracle 提出支持请求以获取旧版本的软件。 Instant Client 产品也相对较新——如果您需要 8.1.7 或 9.0.1 客户端,则需要完整的客户端。

标签: php oracle oracle-call-interface


【解决方案1】:

这是预期的行为。 11.2 客户端未经认证可与任何版本的 Oracle 8i 连接。您至少需要一个 Oracle 9.2.0.4 数据库。如果要连接 8.1.7 数据库,则需要 Oracle 10.2 或更早版本的客户端。 10.2 客户端的初始版本与 Windows Server 2008 R2 系统不兼容,但应该可以安装 10.2.0.5 客户端补丁集。如果您想连接到早于 8.1.7 的 Oracle 数据库,则需要更早版本的 Oracle 客户端,这可能需要安装更早版本的 Windows。

如果您有 Metalink 访问权限,Metalink 207303.1 是Client/ Server Interoperability Matrix

如果您确实安装了 10.2.0.5 完整客户端,则您的 TNS 别名需要使用 SID。服务名称在 8.1.7 中不存在。您可能希望从能够连接到 8.1.7 数据库的机器上复制 TNS 别名。我的猜测是你想要的

SCBLIVE = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = [ORACLE 8i IP])(PORT = 1521)) 
    (CONNECT_DATA = (SERVER = DEDICATED)(SID = SCBLIVE)) 
  )

如果这不起作用,请在命令行中键入 tnsping scblive 并复制并粘贴结果。

【讨论】:

  • 非常感谢。我刚刚安装了即时客户端 10.2.0.5 win32(我使用的是 11.2 32bit),但是它仍然无法工作。 oci模块无法加载“找不到指定的模块”,所以我什至无法使用这个客户端连接oracle 10g。我要求服务器人员让他们检查 oracle 版本以查看它是否是 8.1.7 或更早。
  • @user1631658 - 您的 Windows 2008 R2 服务器不是 64 位的吗?您似乎很可能需要 64 位客户端。我假设 Windows Server 2008 R2 支持 10.2.0.5 Instant Client。不过,您可能想要测试完整的客户端安装。
  • 刚刚测试过。 64bit 10.2.0.5 也不能工作。同样的问题“您的计算机中缺少 MSVCR71.DLL”
  • 可以通过将 MSVCR71.dll 移动到该文件夹​​来使用 sqlplus,并且现在可以加载 oci 模块。但是对于 oracle 8i 服务器仍然会出现“ORA-12514 错误”,现在对于 oracle 10g 服务器也会出现“ORA-12514 错误”。有什么想法吗?
  • 对于完整客户端,我必须安装 Oracle 8.1.7 还是 9.01。 ?
【解决方案2】:

我将我以前的 Oracle 9/8 客户端的 ora.... 文件夹和所有相关 dll 复制到特定文件夹并将这两个文件夹放入路径变量中。一次,我成功地在 php 中使用 oci 连接到 Oracle 8.1.7。

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 2021-03-02
    • 2014-06-23
    • 2011-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多