我正在尝试连接到新合作伙伴 11g 版本 11.2.0.4.0 的 Oracle 数据库,但收到以下错误:
警告: oci_connect(): ORA-12545: 连接失败,因为目标主机或对象不存在
合作伙伴确认提供的连接字符串正确。
这是我的 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);
返回:
警告:oci_connect():ORA-12154:TNS:无法解析指定的连接标识符
为了清楚地了解我所做的事情,以下是我创建应用程序服务并安装 oci8 php 驱动程序所采取的步骤:
之后我可以确认我的 phpinfo() 页面上是否存在 oci8 扩展。
遵循本文档执行的步骤:Azure 应用服务 Linux - 添加 PHP 扩展
我后来也将 ORACLE_HOME 设置定义为 /home/site/oracle/instantclient_18_5,但没有区别。
我没有主意,有人可以告诉我可能导致此问题的原因以及如何解决它。
编辑:
与合作伙伴进一步交谈后,很明显,考虑到当前的配置,我无法连接到他们的数据库。正如 Christopher Jones 的评论所述,这是一个网络问题,ORA-12545、ORA-12541、ORA-12514 和 ORA-01017 – 如何修复 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 等,所有负载平衡等都将起作用。
祝你好运, 大卫