oci_connect()ORA-12170:TNS:发生连接超时

时间:2017-01-14 08:36:24

标签: php oracle oci

我需要使用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] => 
)

1 个答案:

答案 0 :(得分:-1)

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

  • 将sqlnet.ora中的一个或所有参数SQLNET.INBOUND_CONNECT_TIMEOUTSQLNET.OUTBOUND_CONNECT_TIMEOUTSQLNET.SEND_TIMEOUTSQLNET.RECV_TIMEOUTTCP.CONNECT_TIMEOUT重新配置为较大的值。

    • SQLNET.RECV_TIMEOUT - 对于客户端偶尔或异常关闭的环境,建议设置此参数。如果客户端未在指定的时间内发送任何数据,则数据库服务器会记录ORA-12535:TNS:操作超时和ORA-12609:TNS:接收超时发生消息到sqlnet.log文件。如果没有此参数,数据库服务器可能会继续等待来自可能已关闭或遇到困难的客户端的数据。
    • SQLNET.SEND_TIMEOUT - 如果数据库服务器无法在指定的时间内完成发送操作,则会记录ORA-12535:TNS:操作超时和ORA-12608:TNS:发送超时的消息发送到sqlnet。日志文件。如果没有此参数,数据库服务器可能会继续向由于计算机故障或忙碌状态而无法接收数据的客户端发送响应。
    • SQLNET.INBOUND_CONNECT_TIMEOUT - 如果在指定的时间内未建立Oracle Net连接,则终止连接尝试。客户端收到ORA-12170:TNS:连接超时发生错误。出站连接超时间隔是TCP连接超时间隔的超集,它指定建立TCP连接所需时间的限制。此外,出站连接超时间隔包括连接到提供所请求服务的Oracle实例所花费的时间。如果没有此参数,则数据库服务器的客户端连接请求可能会阻止数据库服务器主机系统无法访问时的默认TCP连接超时持续时间(60秒)。出站连接超时间隔仅适用于TCP,TCP和SSL以及IPC传输连接。
    • SQLNET.INBOUND_CONNECT_TIMEOUT - 如果客户端未能在指定的时间内建立连接并完成身份验证,则数据库服务器将终止连接。此外,数据库服务器将客户端的IP地址和ORA-12170:TNS:Connect timeout occurred错误消息记录到sqlnet.log文件中。客户端收到ORA-12547:TNS:丢失联系人或ORA-12637:数据包接收失败错误消息。
    • TCP.CONNECT_TIMEOUT - 指定客户端与数据库服务器建立TCP连接(TNS连接地址中的PROTOCOL = tcp)的时间(以秒为单位)。如果未在指定的时间内建立与数据库主机的TCP连接,则终止连接尝试。客户端收到ORA-12170:TNS:连接超时发生错误。超时适用于主机名解析的每个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/admin   在UNIX平台和%ORACLE_HOME%\NETWORK\ADMIN Windows上   操作系统。

     

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

致谢:ORA-12170: TNS: Connect timeout occurred tipsParameters for the sqlnet.ora File