oracle 如何解决ORA-12154:在Azure中使用PHP OCI 8 oci_connect时出现TNS错误

zbdgwd5y  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(119)

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

**警告:**oci_connect():ORA-12545:连接失败,因为目标主机或对象不存在

伙伴确认提供的连接字符串是正确的。
这是当前mine 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:无法解析指定的连接标识符

为了给予一个清晰的图片我做了什么,下面是我采取的步骤来创建我的应用程序服务和安装oci 8 php驱动程序:
1.我创建了一个Azure应用程序服务,它使用PHP,版本7.3.26;
1.在/home/site中创建一个新的Oracle目录;
1.将即时客户端添加到新的oracle目录中,在本例中,它是Instant Client Linux x86-64 18.5.0.0.0v(bouth basic和sdk包);
1.程序使用命令pecl install oci 8 -2.2.0;
1.我在安装过程中指出了即时客户端的位置,oci 8驱动安装成功;
1.将新的oci8.so文件复制到/home/site内的ext目录;
1.创建了一个php.ini文件,扩展名为=/home/site/ext/oci8.so;
1.将PHP_INI_SCAN_INI配置定义为/usr/local/etc/php/conf.d:/home/site/ini;
1.将LD_LIBRARY_PATH定义为/home/site/oracle/instantclient_18_5。
之后,我可以在phpinfo()页面上确认oci 8扩展的存在。
这些步骤是根据本文档执行的: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,在这种情况下,缺乏适当的反馈。

fbcarpbf

fbcarpbf1#

好吧
所以我和它斗争了很长一段时间,无论我做了什么,都不能让它找到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的定义(如上所述,在$connection_string中)放入“服务器名称”,它将工作。你甚至不需要tnsnames.ora等等。所有的负载平衡等等都能正常工作。
祝你好运,大卫

相关问题