文章

ojdbc-连接 Oracle 实例提示 ora-01034 和 ora-27101

ojdbc-连接 Oracle 实例提示 ora-01034 和 ora-27101

前言

同事反馈连接 Oracle 实例时提示 ora-01034 和 ora-27101 错误,这个问题通常是由于 Oracle 实例没有启动引起的

ora-01034 ora-27101

处理过程

检查 Oracle 实例状态

检查 Oracle 实例是否已经启动,可以通过以下命令查看 Oracle 实例状态:

1
2
3
4
5
6
7
8
9
# 查看 Oracle 实例状态
ps -ef | grep pmon

# 查看 Oracle 实例监听状态
lsnrctl status

# 直接 sqlplus 连接
sqlplus / as sysdba

检查发现 Oracle 实例状态运行正常,alert 日志也没有异常信息,但是程序连接 Oracle 实例时提示 ora-01034 和 ora-27101 错误。查看监听和服务状态也是正常的。这里就不贴图了

自己尝试利用 SQL plus 远程连接 Oracle 实例,发现可以正常连接,但是程序连接时还是报错。这个问题就比较奇怪了,因为程序连接 Oracle 实例和 SQL plus 连接 Oracle 实例是一样的,为什么程序连接时会报错呢?询问得知开发同事使用的工具是 工具 datagrip,驱动 ojdbc8

在我的电脑上没有这个工具,所有尝试直接使用 ojedbc8 连接 Oracle 实例,发现可以正常连接。进一步得知测试环境可以正常连接,只有生产环境连接时才会报错。这个问题就比较奇怪了,因为生产环境和测试环境的 Oracle 实例是一样的,不同的是测试环境使用的是 Oracle 19c 的 no-cdb 模式,生产环境使用的是 Oracle 19c 的 cdb 模式。因为最初的环境并不是我搭建的,突然反馈说有问题才介入排查

使用 ojdbc8 连接 Oracle 19c 实例

因为没有对应的工具,所以这里直接使用 ojdbc8 驱动连接 Oracle 19c 实例,连接代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleDriver;

public class OracleConnection {
    public static void main(String[] args) {
        String jdbcUrl = "jdbc:oracle:thin:@//192.168.200.207:1521/orclpdb1";
        String username = "testuser";
        String password = "Qu32-8Sdf";

        try {
            // 注册驱动
            DriverManager.registerDriver(new OracleDriver());

            // 建立连接
            Connection conn = DriverManager.getConnection(jdbcUrl, username, password);

            System.out.println("连接成功!");

            // 关闭连接
            conn.close();
        } catch (SQLException e) {
            System.err.println("连接失败:");
            e.printStackTrace();
        }
    }
}

编译运行

ojdbc8.jar 驱动不需要单独下载,直接在 ll $ORACLE_HOME/jdbc/lib/ojdbc.jar 中拷贝到代码所在的目录即可,如果不确定位置可以使用 locate ojdbc8.jar 查找

1
2
javac -cp ojdbc8.jar OracleConnection.java
java -cp .:ojdbc8.jar OracleConnection

ojdbc8 conn oracle

尝试更换工具

因为已经尝试使用使用 SQL plus 和 ojdbc8 连接 Oracle 19c 实例是可以正常连接的,所以这里尝试更换工具。为什么 datagrip 连接 Oracle 19c 实例会报错,怀疑是工具的问题,因为需要通过堡垒机配置环境才能使用图形工具,比较麻烦,所以就让开发同事自己更换工具测试一下

第二天更换工具 navicat 之后,发现还是无法正常连接实例。之前也已经检查过监听和 sqlnet.ora 文件配置正常,如果有问题我使用 ojdbc8 连接 Oracle 19c 实例也应该无法连接。

查找了一些资料,基本都是无法实例异常才会有这个问题,但是环境中的实例都是正常的,日志也是正常,这个时候开发同事反馈说其实什么工具不重要,重要的抽数工具能够使用就行。询问抽数工具使用的是 flink,本质上也是通过 jdbc 连接 Oracle 实例

让开发同事提供了 flink 连接报错的截图如下 flink Oracle

发现数据库连接串的 url 貌似存在问题,让开发同事将连接串从 jdbc:oracle:thin:@192.168.200.207:1521:orclpdb1 修改为 jdbc:oracle:thin:@//192.168.200.207:1521/orclpdb1 之后,flink 就可以正常连接 Oracle 19c 实例了,19c 多租户模式需要通过服务名连接,而不是 sid。默认情况下,在 PDB 创建时就会为 PDB 生成对应的服务。

总结

一开始的截图遮挡住了 url 信息,导致没有发现问题,这个问题就是 url 连接串的问题,连接串的格式不对,导致连接失败。这个问题也是比较常见的,连接串的格式不对,导致连接失败。以为 url 是通过配置自动生成的,所以没有怀疑 url 的问题,但是 url 的格式不对,导致连接失败。后续查看到新的截图才发现问题

JDBC 连接 ORACLE 的三种 URL 格式

  • SID 格式
    1
    
    jdbc:oracle:thin:@<host>:<port>:<sid>
    
  • Service Name 格式
    1
    
    jdbc:oracle:thin:@//<host>:<port>/<service_name>
    
  • TNS 格式
    1
    
    jdbc:oracle:thin:@<tns_name>
    
本文由作者按照 CC BY 4.0 进行授权

© TheDarkStarJack. 保留部分权利。

[本站总访问量次] [本站访客数人次] [本文总阅读量次]

本站采用 Jekyll 主题 Chirpy