我正在尝试将oracle tnslsnr端口号从默认更改为其他端口。 在我将tnslsnr的端口号从1521更改为2000后,我开始创buildORA-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,OS是CentOS 5.8
TNSNAMES是一个“连接信息抽象”。 这是你隐藏主机名,故障转移信息,端口号,servicename和上帝知道什么的地方。
你为什么连接使用主机名,端口和SID?
jdbc:oracle:thin:@testhost:2000:testdb
嘿! 因为你没有使用TNSNAMES! 您的连接string是一个主机连接。 主机连接直接连接到主机,不会注意到你的tnsnames.ora文件。 (你还没有指示JDBC来看看…)
接下来,不build议连接到指定SID的oracle数据库。 而是指定SERVICE_NAME。 (对于12c, 不应再使用SID)
jdbc:oracle:thin:@testhost:2000/SERVICE_NAME
要标识您的实例的service_name:
$sqlplus / as sysdba SQL>show parameter service
为了使用jdbc的TNSNAMES看看这里
在端口2000上侦听器LISTENING?
#netstat -tulpn | grep :2000
实例尝试向侦听器注册,其默认端口值为1521.它被称为dynamic实例注册 。 使用非默认端口值时,向侦听器的注册将失败。 为了进行调整,初始化参数LOCAL_LISTENER就像这样进入图片:
$sqlplus / as sysdba SQL>alter system set LOCAL_LISTENER='(ADDRESS =(PROTOCOL=TCP)(HOST=localhost)(PORT=2000);
现在它会工作。 100%
请在这里查看LOCAL_LISTENER参数的详细说明