Linux

ORA-12505, TNS: 監聽器在更改埠號後目前不知道 SID

  • December 31, 2015

我正在嘗試將 oracle tnslsnr 埠號從預設更改為其他埠。在我將 tnslsnr 的埠號從 1521 更改為 2000 後,我開始收到 ORA-12505,TNS:listener 目前不知道來自 JDBC 驅動程序的 SID。只要埠是 1521,一切正常。

我的 listener.ora 文件的內容:

# Generated by Oracle configuration tools.
LISTENER =
 (DESCRIPTION_LIST =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 2000))
 )
)

我的 tnsnames.ora 文件的內容:

TESTDB =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 2000))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = testdb.localdomain)
   )
)

我嘗試連接的 JDBC URL:jdbc:oracle:thin:@testhost:2000:testdb

數據庫版本為12c,作業系統為CentOS 5.8

TNSNAMES 是“連接資訊抽象”。這是您隱藏主機名、故障轉移資訊、埠號、服務名和天知道的地方。

為什麼要使用主機名、埠和 sid 進行連接?

jdbc:oracle:thin:@testhost:2000:testdb

嘿!因為你沒有使用 TNSNAMES!您的連接字元串是 HOST 連接。主機連接直接連接到主機,不會注意到您的 tnsnames.ora 文件。(你還沒有指示 JDBC 去那裡看……)

其次,不建議連接到指定 SID 的 oracle 數據庫。而是指定 SERVICE_NAME。(對於 12c,不應再使用 SID)

jdbc:oracle:thin:@testhost:2000/SERVICE_NAME  

要辨識您的實例的 service_name:

$sqlplus / as sysdba
SQL>show parameter service

要將 TNSNAMES 用於 jdbc,請查看此處

監聽器是否在埠 2000 上監聽?

#netstat -tulpn | grep :2000

實例嘗試使用預設埠值 1521 註冊到偵聽器。這稱為動態實例註冊。使用非預設埠值時,向偵聽器的註冊將失敗。為了對此進行調整,初始化參數 LOCAL_LISTENER 如下所示:

$sqlplus / as sysdba     
SQL>alter system set LOCAL_LISTENER='(ADDRESS =(PROTOCOL=TCP)(HOST=localhost)(PORT=2000);

現在它將起作用。100%

到這裡查看LOCAL_LISTENER參數的詳細解釋

引用自:https://serverfault.com/questions/684356