gpt4 book ai didi

php - 如何解决ORA-12154 : TNS error when using PHP OCI8 oci_connect in Azure

转载 作者:行者123 更新时间:2023-12-03 03:48:53 25 4
gpt4 key购买 nike

我正在尝试连接到新合作伙伴 11g 版本 11.2.0.4.0 的 Oracle 数据库,但收到以下错误:

Warning: oci_connect(): ORA-12545: Connect failed because target host or object does not exist

合作伙伴确认提供的连接字符串正确。

这是我的 oci_connect() 的当前结构和正在使用的所述连接字符串:

$connection_string = '(DESCRIPTION = (ADDRESS_LIST = (LOAD_BALANCE = ON)(FAILOVER = ON)(ADDRESS = (PROTOCOL = TCP)(HOST = HOST)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = SERVICE_NAME)))'
$conn = oci_connect($username, $password, $connection_string, 'UTF8', OCI_DEFAULT);

但是,当使用以下结构时:

$connection_string = 'user/password@host:port/service_name'
$conn = oci_connect($username, $password, $connection_string, 'UTF8', OCI_DEFAULT);

它返回:

Warning: oci_connect(): ORA-12154: TNS:could not resolve the connect identifier specified

为了清楚地了解我所做的事情,以下是我创建应用程序服务并安装 oci8 php 驱动程序所采取的步骤:

  1. 我创建了一个 Azure 应用服务,它使用 PHP 版本 7.3.26;
  2. 在/home/site 中创建了一个新的 oracle 目录;
  3. 将即时客户端添加到新的 oracle 目录中,在本例中为 Instant Client Linux x86-64 18.5.0.0.0v(基本包和 sdk 包);
  4. 继续使用命令 pecl install oci8-2.2.0;
  5. 我在安装过程中指出了即时客户端的位置,oci8驱动安装成功;
  6. 将新的 oci8.so 文件复制到/home/site 内的 ext 目录;
  7. 创建了一个 php.ini 文件,并设置了 extension=/home/site/ext/oci8.so;
  8. 将 PHP_INI_SCAN_DIR 配置定义为/usr/local/etc/php/conf.d:/home/site/ini;
  9. 将 LD_LIBRARY_PATH 定义为/home/site/oracle/instantclient_18_5。

之后我可以确认我的 phpinfo() 页面上是否存在 oci8 扩展。

这些步骤遵循本文档:Azure App Service Linux - Adding PHP Extensions

我后来还将 ORACLE_HOME 设置定义为/home/site/oracle/instantclient_18_5,但没有区别。

我没有主意,有人可以告诉我是什么原因导致了这个问题以及如何解决它。

<小时/>

编辑:

与合作伙伴进一步交谈后,很明显,考虑到当前的配置,我无法连接到他们的数据库。正如克里斯托弗·琼斯的评论所指出的,这是一个网络问题,ORA-12545, ORA-12541, ORA-12514, & ORA-01017 – How to fix for SQL Developer ,并且在这种情况下,缺乏适当的反馈。

最佳答案

好的,

所以我与这个问题斗争了很长时间,无论我做什么,永远都无法让它找到 tnsnames.ora 文件。最后,我决定从 tnsnames.ora 文件中提取连接字符串定义,并将其作为连接字符串直接插入到 oci_connect 语句中,并且它起作用了:

//$connection_string = '(DESCRIPTION = (ADDRESS_LIST = (LOAD_BALANCE = ON)(FAILOVER = ON)(ADDRESS = (PROTOCOL = TCP)(HOST = HOST)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = SERVICE_NAME)))'
$connection_string = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.10)(PORT=1521))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = pdb_mypdb.xyz.com)))';
$conn = oci_connect("mypdb", "mypdbpw", $connection_string );

更酷的是,在很多第三方程序中,当它们询问 oracle 服务器的名称时,您可以将整个 tnsnames.ora CONNECT 定义(如上面的 $connection_string 中)放入“服务器名称”,它将起作用。您甚至不需要 tnsnames.ora 等,所有负载平衡等都将起作用。

祝你好运,大卫

关于php - 如何解决ORA-12154 : TNS error when using PHP OCI8 oci_connect in Azure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67779980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com