博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。
技术范围: 目前专注java体系,有多年java、golang、.Net、DDD、软件架构、redis、nginx、tomcat、mysql、oracle等经验
业务范围: 对传统业务应用技术转型,从数字医院到区域医疗,从院内业务系统到互联网医院及健康服务,从公立医院到私立医院都有一些经历及理解
*** 为大家分享一些技术积累,欢迎交流合作 持续关注Yuperman ***
解决应用程序无法连接Oracle数据库问题,报错
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
ORA-12505, TNS:监听程序当前无法识别连接描述符中所给出的 SID
- 注:本问题解决的不是数据库初次安装引起的问题,而是业务系统已经正常运行一段时间,突然发生无法连接情况
Oracle常见问题系列文章
Oracle最大连接数配置
ORA-03137: TTC 协议内部错误
客户端或plsql无法连接Oracle问题之一
客户端或plsql无法连接Oracle问题之二
本文环境
服务器操作系统: windows server 2016
ORACLE 版本: ORACLE 11.2.0.1.0
应用程序:springboot
SID 系统标识符说明
SID是Oracle数据库中的一个唯一标识符,用于区分不同的数据库实例。它是由数据库在启动时自动生成的,通常与数据库实例的名称相同。SID的命名通常采用大写字母,并且长度不超过8个字符。SID在连接到数据库时,作为连接字符串的一部分使用。
例如,考虑一个数据库实例名为”ORCL”的Oracle数据库。在tnsnames.ora文件中,我们可以定义一个连接到这个数据库实例的条目如下:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ORCL)
)
)
在这个示例中,”ORCL”是SID的名称,它被用于连接到这个数据库实例。
1.问题描述
线上系统正常运行,突然系统无法登录及使用,发现业务系统无法连接数据库,提示错误:NetException: Listener refused theconnection with the following error: ORA-12505TNS:listener does not currently know of SID given inconnect descriptor
排查步骤:
经过了解线上情况排查后发现,系统未做升级及任何改动,但是由于其他系统发生问题,重启了Oracle数据库,所以判定应该是有数据库重启引起的问题,对spingboot 应用服务进行重启后,spingboot可以正常访问数据库。
2.问题原因
本文中遇到的问题猜测应该是ORACLE数据库进行了重启,引起了springboot与oracle建立的连接所使用的CONNECTION ID发生了变化,所以无法连接,引起的客户端无法连接
Oracle 的 CONNECTION ID 发生变更引起
3.解决方法:
重启了springboot应用程序,问题解决。
4.案例总结:
本文遇到的问题是线上业务系统在使用过程中,对oracle数据库进行了重启引起应用程序无法连接。
另外还有一种情况是如果应用系统首次运行或应用环境发生了变更,则大概率是数据库连接字符串书写格式的问题引起,这个也需要大家注意。
常见的两种Oracle数据库连接格式如下
//监听sid服务,表示sid为orcl
database.url=jdbc:oracle:thin:@171.xxx.96:xxxx:orcl
//监听服务名,表示服务名为orcl
database.url=jdbc:oracle:thin:@171.xxx.96:xxxx/orcl
推荐使用
//监听服务名,表示服务名为orcl
database.url=jdbc:oracle:thin:@171.xxx.96:xxxx/orcl