我正在尝试将 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 参数的详细说明