oracle 19c 连接失败解决方案

文章讲述了在遇到SQLPlus可以成功连接Oracle数据库,但PL/SQLDeveloper无法连接时的排查方法。关键在于检查`listener.ora`配置文件,特别是(HOST=)配置不应使用电脑名字,而应使用IP地址或者localhost。同时,确保LSNRCTLstatus正常,监听器配置正确,并且`tnsnames.ora`文件设置无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sqlplus 可以连接成功,但是plsql 无法连接解决方案

首先保证lsnrctl status 状态正常

配置的坑总结:

1. listener.ora 配置的  (ADDRESS = (PROTOCOL = TCP)(HOST = 【注意这里】)(PORT = 1521)) {HOST 值这里不要配置电脑的名字}
C:\Users\xxx >lsnrctl status

LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production on 18-6月 -2023 13:29:08

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for 64-bit Windows: Version 19.0.0.0.0 - Production
開始日                    18-6月 -2023 13:12:18
稼働時間                  00 時間 1652 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      E:\xzip\WINDOWS.X64_193000_db_home\network\admin\listener.ora
ログ・ファイル            E:\xzip\WINDOWS.X64_193000_db_home\log\diag\tnslsnr\xxxx \listener\alert\log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxx)(PORT=1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
  • listener.ora 配置
# listener.ora Network Configuration File: E:\xzip\WINDOWS.X64_193000_db_home\network\admin\listener.ora
# Generated by Oracle configuration tools.

# LISTENER =
#   (DESCRIPTION =
#     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
#   )



SID_LIST_LISTENER =
 (SID_LIST =
    (SID_DESC =
      (SID_NAME = ORCL)
      (ORACLE_HOME =E:\xzip\WINDOWS.X64_193000_db_home)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:E\xzip\WINDOWS.X64_193000_db_home\bin\oraclr19.dll")
    )
   (SID_DESC =
     (GLOBAL_DBNAME = ORCL)
     (ORACLE_HOME =E:\xzip\WINDOWS.X64_193000_db_home)
     (SID_NAME = ORCL)
    )
  )


LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

    )

  )

ADR_BASE_LISTENER = E:\xzip\WINDOWS.X64_193000_db_home
  • tnsnames.ora
# tnsnames.ora Network Configuration File: E:\xzip\WINDOWS.X64_193000_db_home\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL_LOCAL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

<think>首先,用户的问题是关于JDBC连接Oracle 19c数据库时出现的错误。用户提到了错误12505,并参考了引用[1],其中描述了帆软连接Oracle 19c数据库的问题,错误12505,解决方法是将连接字符串中的":"改为"/"。 用户还提供了其他引用,比如引用[2]关于Java连接Oracle 19c的JDBC驱动下载,引用[3]和[4]关于Kettle连接Oracle 19c的解决办法,使用特定的连接字符串格式。 用户的问题是:"我想解决JDBC连接Oracle 19c数据库时遇到的错误 请问JDBC连接Oracle 19c数据库时出现错误,如何解决?" 所以,我需要基于用户提供的引用和系统指令,给出结构清晰的回答。系统指令要求: - 所有行内数学表达式使用$...$格式(但这个问题可能涉及数学表达式)。 - 独立公式使用$$...$$格式(同样,可能适用)。 - LaTeX语法正确(确保任何数学表达正确)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:用户提供了四个引用,我需要尽可能参考这些引用。 用户提供的引用: - [^1]: 帆软连接Oracle 19c错误12505,解决方法:修改连接字符串,将":sid"改为"/service_name"。 - [^2]: Java连接Oracle 19c,需要下载正确的JDBC驱动(ojdbc8 for JDK8+)。 - [^3]: Kettle连接Oracle 19c,使用特定格式的连接字符串。 - [^4]: 类似[^3],描述连接字符串格式。 核心问题:错误12505通常表示Oracle监听器无法识别SID或服务名。Oracle 19c默认使用服务名而是SID。 从引用[^1]中,解决方法是将连接URL从`jdbc:oracle:thin:@host:port:sid`改为`jdbc:oracle:thin:@host:port/service_name`。 类似地,引用[^3]和[^4]使用更复杂的格式:`jdbc:oracle:thin:@(DESCRIPTION=...)`,但基本思想是使用服务名。 回答结构: 1. **理解错误**:解释错误12505的含义。 2. **常见原因**:Oracle 19c的配置变化。 3. **解决方法**: - 使用服务名代替SID。 - 确保JDBC驱动正确。 - 其他可能步骤。 4. **逐步指导**:给出具体步骤。 5. **生成相关问题**:在最后添加相关问题。 确保使用中文。 添加引用标识:当引用用户提供的引用时,在末尾添加[^1], [^2]等。 最终回答格式: - 开头:直接回答问题。 - 主体:分步解释。 - 结尾:相关问题。 相关问题示例(基于系统指令的示例): - 如何下载Oracle JDBC驱动? - 如何配置Oracle监听器? - 其他常见JDBC错误? 现在,草拟回答。</think>### JDBC连接Oracle 19c数据库错误解决方法 当您使用JDBC连接Oracle 19c数据库时遇到错误(如12505错误),这通常是由于Oracle 19c的配置变化引起的。Oracle 19c默认使用服务名(Service Name)而非SID(System Identifier)进行连接,这可能导致传统JDBC连接字符串失效。错误12505表示监听器无法识别您提供的SID或服务名,从而拒绝连接[^1]。以下我将基于常见问题和引用资料,逐步指导您解决此问题。整个过程使用Java JDBC作为示例,但原理适用于其他工具(如帆软、Kettle等)。 #### 步骤1: 确认错误原因和基本配置 - **错误分析**:错误12505通常源于连接字符串格式正确。Oracle 19c在监听器配置中可能未启用SID模式,而是优先使用服务名[^1]。例如,如果您使用类似`jdbc:oracle:thin:@host:1521:sid`的格式,Oracle 19c监听器无法识别SID,导致连接失败。 - **检查JDBC驱动**:确保您使用兼容Oracle 19c的JDBC驱动。Oracle 19c需要ojdbc8.jar(适用于JDK 8+)或ojdbc10.jar(适用于JDK 10+)。您可以从Oracle官网下载:https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19c-downloads.html [^2]。如果驱动版本匹配,可能引发兼容性问题。 - **验证数据库信息**:确认数据库的服务名(Service Name)而非SID。您可以通过SQL查询获取:登录数据库服务器,执行`SELECT value FROM v$parameter WHERE name = 'service_names';`。服务名通常以`service_name`形式出现(如`orclpdb`),而非传统的SID(如`orcl`)。 #### 步骤2: 修改JDBC连接字符串 这是解决12505错误的核心步骤。Oracle 19c推荐使用服务名或完整TNS描述替代SID。以下是常见修改方案: - **方案1: 使用服务名格式(推荐)** 将连接URL中的`:sid`改为`/service_name`。例如: - 错误格式:`jdbc:oracle:thin:@localhost:1521:orcl` - 正确格式:`jdbc:oracle:thin:@localhost:1521/orclpdb`(其中`orclpdb`是服务名) 这种方法简单高效,无需修改数据库服务器配置。引用中帆软连接成功案例显示,修改后连接立即恢复[^1]。 - **方案2: 使用TNS描述格式(适用于复杂环境)** 如果服务名方式无效,或您需要指定更多参数(如负载均衡),可使用完整TNS描述。格式如下: ```java jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=dvs1))) ``` 其中`HOST`、`PORT`和`SERVICE_NAME`需替换为您的实际值。Kettle和Java连接案例中,此格式成功解决了监听器识别问题[^3][^4]。在Java代码中,示例: ```java String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orclpdb)))"; Connection conn = DriverManager.getConnection(url, "username", "password"); ``` - **方案3: 检查监听器文件(可选,但需谨慎)** 如果以上方法无效,可能需要修改Oracle服务器上的`listener.ora`文件,启用SID支持。但引用提到,这通常推荐,因为它需要服务器权限且可能影响其他服务[^1]。如果您有权限,可添加: ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (SID_NAME = orcl) (ORACLE_HOME = /path/to/oracle/home) ) ) ``` 然后重启监听器:`lsnrctl reload`。 #### 步骤3: 测试连接和常见排查 - **测试连接**:使用简单Java程序验证: ```java import java.sql.Connection; import java.sql.DriverManager; public class OracleTest { public static void main(String[] args) { try { Class.forName("oracle.jdbc.OracleDriver"); String url = "jdbc:oracle:thin:@localhost:1521/orclpdb"; // 替换为您的URL Connection conn = DriverManager.getConnection(url, "user", "password"); System.out.println("连接成功!"); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 如果仍失败,检查: - 防火墙是否开放1521端口。 - 数据库服务是否运行:`sqlplus / as sysdba`后执行`SELECT status FROM v$instance;`。 - JDBC驱动是否在classpath中。 #### 总结 解决JDBC连接Oracle 19c错误的关键是使用服务名格式(例如`jdbc:oracle:thin:@host:port/service_name`)或TNS描述格式。这避免了监听器对SID的识别问题[^1][^3]。确保驱动版本正确(ojdbc8+)[^2],大多数情况下无需修改服务器配置。如果问题持续,请提供错误日志以便进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明爱IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值