ORA-12505,TNS:监听器在更改端口号后当前不知道 SID

ORA-12505,TNS:监听器在更改端口号后当前不知道 SID

我正在尝试将 oracle tnslsnr 端口号从默认更改为其他端口。将 tnslsnr 的端口号从 1521 更改为 2000 后,我开始收到 ORA-12505,TNS:监听器当前不知道 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

答案1

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 参数的详细说明

相关内容