【问题标题】:oci_connect() ORA-12170: TNS:Connect timeout occurredoci_connect() ORA-12170: TNS: 发生连接超时
【发布时间】:2017-01-14 08:36:24
【问题描述】:

我需要使用 oci_connect() 连接到远程 oracle 数据库。等待几分钟后,我收到此错误。

$db =
  '(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX.XXX)(PORT = XXXX))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = citi)
    )
  )';

$conn = oci_connect('username', 'password', $db);
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM Tmt');
oci_execute($stid);

我收到以下错误

PHP Warning:  oci_connect(): ORA-12170: TNS:Connect timeout occurred in /var/www/curiouslabx.com/public_html/wordpress/projects/test.php on line 14
Array
(
    [code] => 12170
    [message] => ORA-12170: TNS:Connect timeout occurred
    [offset] => 0
    [sqltext] => 
)

【问题讨论】:

标签: php oracle oracle-call-interface


【解决方案1】:

原因:服务器关闭,因为连接建立或与客户端的通信未能在分配的时间间隔内完成。这可能是网络或系统延迟的结果;或者这可能表明恶意客户端正试图对服务器造成拒绝服务攻击。

  • 将sqlnet.ora中的SQLNET.INBOUND_CONNECT_TIMEOUT,SQLNET.OUTBOUND_CONNECT_TIMEOUT,SQLNET.SEND_TIMEOUT,SQLNET.RECV_TIMEOUT,TCP.CONNECT_TIMEOUT参数中的一个或全部重新配置为更大的值。

    • SQLNET.RECV_TIMEOUT - 对于客户端偶尔或异常关闭的环境,建议设置此参数。如果客户端未在指定的时间内发送任何数据,则数据库服务器将 ORA-12535: TNS:operation timed out 和 ORA-12609: TNS: Receive timeout occurred 消息记录到 sqlnet.log 文件。如果没有此参数,数据库服务器可能会继续等待来自可能已关闭或遇到困难的客户端的数据。
    • SQLNET.SEND_TIMEOUT - 如果数据库服务器无法在指定的时间内完成发送操作,则会将 ORA-12535:TNS:操作超时和 ORA-12608:TNS:发送超时消息记录到 sqlnet.log 文件。如果没有此参数,数据库服务器可能会继续向由于计算机停机或忙碌状态而无法接收数据的客户端发送响应。
    • SQLNET.INBOUND_CONNECT_TIMEOUT - 如果未在指定时间内建立 Oracle Net 连接,则连接尝试将终止。客户端收到 ORA-12170: TNS:Connect timeout occurred 错误。出站连接超时间隔是 TCP 连接超时间隔的超集,它指定了建立 TCP 连接所用时间的限制。此外,出站连接超时间隔包括连接到提供请求服务的 Oracle 实例所用的时间。如果没有此参数,当数据库服务器主机系统无法访问时,客户端对数据库服务器的连接请求可能会阻塞默认的 TCP 连接超时持续时间(60 秒)。出站连接超时间隔仅适用于 TCP、带 SSL 的 TCP 和 IPC 传输连接。
    • SQLNET.INBOUND_CONNECT_TIMEOUT - 如果客户端未能在指定时间内建立连接并完成身份验证,则数据库服务器将终止连接。此外,数据库服务器将客户端的 IP 地址和 ORA-12170: TNS:Connect timeout occurred 错误消息记录到 sqlnet.log 文件中。客户端收到 ORA-12547: TNS:lost contact 或 ORA-12637: Packet receive failed 错误消息。
    • TCP.CONNECT_TIMEOUT - 指定客户端与数据库服务器建立 TCP 连接(TNS 连接地址中的 PROTOCOL=tcp)的时间(以秒为单位)。如果在指定时间内没有建立到数据库主机的 TCP 连接,则终止连接尝试。客户端收到 ORA-12170: TNS:Connect timeout occurred 错误。超时适用于主机名解析到的每个 IP 地址。例如,如果主机名解析为 IPv6 和 IPv4 地址,并且无法通过网络访问该主机,则连接请求超时是 TCP.CONNECT_TIMEOUT 设置的两倍,因为有两个 IP 地址。在此示例中,默认超时设置 60 将导致 120 秒后超时。
  • 如果怀疑是恶意客户端,使用sqlnet.log中的地址来识别来源并限制访问。请注意,记录的地址可能不可靠,因为它们可以被伪造(例如在 TCP/IP 中)。

  • 验证您的 /etc/hosts 文件是否有 DNS 条目: 例如XXX.XXX.XXX.XXX myhost

sqlnet.ora 文件通常位于$ORACLE_HOME/network/adminUNIX 平台和%ORACLE_HOME%\NETWORK\ADMINWindows 操作系统。

Windows OS 中,您的主机文件位于 %SystemRoot%\System32\drivers\etc\hostsUnix, Unix-like, POSIX/etc/hosts

学分:ORA-12170: TNS: Connect timeout occurred tips,Parameters for the sqlnet.ora File

【讨论】:

  • 使用即时客户端时,默认目录至少在Linux上:/usr/lib/oracle/19.6/client64/lib/network/admin/
  • @Simon 如答案中所写默认目录$ORACLE_HOME/network/admin 以查看$ORACLE_HOME 在您的系统中运行env|grep -i ORACLE_HOMEecho ORACLE_HOME 的值。
猜你喜欢
  • 2014-07-21
  • 2016-12-04
  • 2019-01-21
  • 2015-11-03
  • 2016-07-29
  • 2012-02-03
  • 2019-11-13
  • 2015-05-23
  • 2020-10-10
相关资源
最近更新 更多