首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle 11g 64位 PL/SQL 登錄超時排查全流程

     編輯:程式設計綜合問答

錯誤現象

  • PL/SQL Developer 登錄超時。
  • sqlplus user/pass@orcl 報 ORA-12518: TNS:listener could not hand off client connection。
  • JDBC 連接報 Listener refused the connection ... ORA-12518。

核心原因

ORA-12518 表示**監聽器無法將連接移交給服務進程**,常見於:

  1. 服務進程啟動失敗/掛起:數據庫實例未完全打開、SMON/PMON 異常。
  2. 監聽器配置與實例不匹配:listener.ora 中 SID_NAME 與實際實例名不一致。
  3. 進程數/會話數達到上限:processes/sessions 參數過小。
  4. 64 位環境下 ORACLE_HOME 路徑錯誤:監聽器啟動的 oracle 可執行文件位置不對。

分步排查

  1. 本機驗證:
    sqlplus / as sysdba
    -- 若能登錄,說明實例正常,問題在監聽器/網絡
    
  2. 檢查監聽器狀態:
    lsnrctl status
    -- 確認 Services 摘要中顯示 "orcl" 狀態 READY
    
  3. 核對配置:
    # listener.ora 關鍵點
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = orcl)          # 必須與實例名一致
          (ORACLE_HOME = /correct/path) # 64位客戶端必須指向 64位 ORACLE_HOME
        )
      )
    
    # tnsnames.ora 關鍵點
    ORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 正確IP或主機名)(PORT = 1521))
        (CONNECT_DATA = (SERVICE_NAME = orcl)) # 或 SID = orcl
      )
    
  4. 參數調整:
    -- 以 sysdba 登錄後
    SHOW PARAMETER processes;   -- 建議 ≥ 300
    SHOW PARAMETER sessions;    -- 建議 ≥ 450 (1.5 * processes)
    -- 若不足
    ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
    ALTER SYSTEM SET sessions=750 SCOPE=SPFILE;
    -- 重啟實例生效
    
  5. 防火牆/端口:
    telnet 服務器IP 1521  # 確保通
    # 服務器防火牆放行 1521
    

JDBC 連接串優化

jdbc:oracle:thin:@(DESCRIPTION=
  (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))
  (CONNECT_DATA=(SERVICE_NAME=orcl)(SERVER=DEDICATED))
)
# 避免依賴 tnsnames.ora,直接在連接串寫完整描述

ORA-12518 90% 是 **SID_NAME 不匹配** 或 **進程數上限**。先在本機 sqlplus / as sysdba 驗證實例,再核對 listener.ora 的 SID_NAME 與 ORACLE_HOME,最後調大 processes/sessions。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved