2017-01-14 160 views
0

我需要使用oci_connect()連接到遠程oracle數據庫。等待幾分鐘後,我得到這個錯誤。oci_connect()ORA-12170:TNS:發生連接超時

$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] => 
) 
+0

看看這裏有在這一個原因是多方面的http://www.dba-oracle.com/t_ora_12170_tns_connect_timeout.htm –

回答

-1

原因:服務器關閉,因爲連接建立或者與客戶溝通未能在規定的時間間隔內完成。這可能是網絡或系統延遲的結果;或者這可能表明惡意客戶正在嘗試在服務器上導致拒絕服務攻擊。

  • 重新配置的一個或全部參數SQLNET.INBOUND_CONNECT_TIMEOUTSQLNET.OUTBOUND_CONNECT_TIMEOUTSQLNET.SEND_TIMEOUTSQLNET.RECV_TIMEOUTTCP.CONNECT_TIMEOUT在sqlnet.ora中較大的值。

    • SQLNET.RECV_TIMEOUT - 對於客戶端偶爾或異常關閉的環境,建議設置此參數。如果客戶端沒有及時發送任何數據,那麼數據庫服務器會記錄ORA-12535:TNS:操作超時和ORA-12609:TNS:接收發生超時的消息到sqlnet.log文件。如果沒有此參數,數據庫服務器可能會繼續等待來自可能關閉或遇到困難的客戶端的數據。
    • SQLNET.SEND_TIMEOUT - 如果數據庫服務器無法在指定的時間內完成發送操作,則它會記錄ORA-12535:TNS:操作超時和ORA-12608:TNS:向sqlnet.log文件發送發生超時的消息。如果沒有此參數,數據庫服務器可能會繼續向因無法接收數據而導致計算機故障或繁忙狀態的客戶端發送響應。
    • SQLNET.INBOUND_CONNECT_TIMEOUT - 如果在指定的時間內未建立Oracle Net連接,則連接嘗試將終止。客戶端收到ORA-12170:TNS:發生連接超時錯誤。出站連接超時間隔是TCP連接超時間隔的超集,它指定了建立TCP連接所用時間的限制。此外,出站連接超時間隔還包括連接到提供所請求服務的Oracle實例所需的時間。如果沒有此參數,數據庫服務器主機系統無法訪問時,數據庫服務器的客戶端連接請求可能會阻止默認TCP連接超時持續時間(60秒)。出站連接超時間隔僅適用於TCP,帶SSL的TCP和IPC傳輸連接。
    • SQLNET.INBOUND_CONNECT_TIMEOUT - 如果客戶端無法在指定的時間內建立連接並完成身份驗證,則數據庫服務器終止連接。另外,數據庫服務器將客戶端的IP地址和ORA-12170:TNS:發生連接超時錯誤消息記錄到sqlnet.log文件。客戶端收到ORA-12547:TNS:丟失的聯繫或ORA-12637:數據包接收失敗錯誤消息。
    • TCP.CONNECT_TIMEOUT - 要指定的時間,以秒爲一客戶端建立一個TCP連接(PROTOCOL = TCP在TNS連接地址)到數據庫服務器。如果在指定的時間內未建立到數據庫主機的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/adminUNIX平臺和%ORACLE_HOME%\NETWORK\ADMINWindows 操作系統。

Windows OS,你的hosts文件位於 %SystemRoot%\System32\drivers\etc\hostsUnixUnix-likePOSIX,在/etc/hosts

學分:ORA-12170: TNS: Connect timeout occurred tipsParameters for the sqlnet.ora File