ojdbc-连接 Oracle 实例提示 ora-01034 和 ora-27101
前言
同事反馈连接 Oracle 实例时提示 ora-01034 和 ora-27101 错误,这个问题通常是由于 Oracle 实例没有启动引起的
处理过程
检查 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
尝试更换工具
因为已经尝试使用使用 SQL plus 和 ojdbc8 连接 Oracle 19c 实例是可以正常连接的,所以这里尝试更换工具。为什么 datagrip 连接 Oracle 19c 实例会报错,怀疑是工具的问题,因为需要通过堡垒机配置环境才能使用图形工具,比较麻烦,所以就让开发同事自己更换工具测试一下
第二天更换工具 navicat 之后,发现还是无法正常连接实例。之前也已经检查过监听和 sqlnet.ora 文件配置正常,如果有问题我使用 ojdbc8 连接 Oracle 19c 实例也应该无法连接。
查找了一些资料,基本都是无法实例异常才会有这个问题,但是环境中的实例都是正常的,日志也是正常,这个时候开发同事反馈说其实什么工具不重要,重要的抽数工具能够使用就行。询问抽数工具使用的是 flink,本质上也是通过 jdbc 连接 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>