问题现象
客户要搭建灰度环境,启动后,登录超级管理员报连接不上数据库的错误。
Can't get connection from database(XXX)
问题分析
1、一般碰到这个问题,初步就开始怀疑是sysconfig数据源不通导致的。
发现数据源是通的。
2、在sysconfig中看到选择的是11G,但是客户数据库版本用的是12C。但驱动都是同一个驱动。为了保险起见,更改了数据库类型为12C,再次重新启动。
3、发现sysconfig中配置了无效数据源,为了排错,直接删掉不通的数据源。
4、重新启动服务,发现依旧有明显的报错,can not get connection.please check the DBSet.
又进到sysconfig中直接测试是通的。
5、怀疑数据库本身有问题。用plsql直接连取数据库,dos窗口直连都无任何异常,数据库alter日志和监听日志中也无报错。(虽然这个没有走驱动,但说明数据库本身暂无异常。)
6、查询了process参数发现配置为150,很低,扩展到2000,重启了数据库服务,问题依旧未解决。
7、于是怀疑代码本身有问题。用sysconfig直接连生产环境的数据库,但这次测试报不通。检查驱动路径driver下发现有冗余代码存在。删除掉冗余代码后,再次测试,测试通过。
8、连新数据源再次重启发现相关代码不报连接数据库的错误。系统正常登录。说明发生问题肯定是在数据库层面。
9、数据库是本地部署和应用在同一台服务器,首先排除网络不通的环境影响。
10、使用nchome\bin>checkDBconnect.bat 检查数据库连接脚本发现报相ORA-28040的错误。
但是发现sqlnet.ora文件已经配置了客户端兼容参数,兼容到9已经很老了。于是暂时认为checkDBconnect.bat脚本检测的有问题所致,忽略了此问题。
注意:坑在这!!CheckDB报错,但sysconfig测试正常。
11、检查监听日志大小为20M,小于4G,非监听日志过大导致。
12、怀疑是不是监听程序本身异常,重新配置了监听程序。问题依旧。
13、检查数据库监听文件listener.ora、tnsnames.ora发现监听配置的为主机名。怀疑是不是解析不到相关主机造成的。
14、 ping相关主机名,发现返回值非服务器IP,修改host文件后问题依旧。
15、怀疑驱动程序有问题,把相关驱动替换到nchome中,发现测试不通过,经过咨询得知12.2版本的驱动基于的jdk编译版本过高用不了。要了12.1版本的驱动包更换drivers、lib问题依旧未解决。
16、查询了数据库本身发现,初始创建的表空间非NNC_DATA_01,重建表空间后导入数据。问题依旧未解决。
17、这类问题,之前很多碰到的是dns解析不通过,于是检查了IPV4的DNS解析配置地址发现里面配置了DNS解析地址为公网地址,但是服务器未开通公网。
直接ping相关地址发现不通。清空DNS服务器地址后,再次尝试,发现问题依旧未解决。
17、所有能想到的办法都已经尝试,但启动后问题依旧。于是又怀疑到了第9步骤。
到底是CheckDB准还是测试数据源准???按照ORA-28040问题处理。
建议把兼容性从9变成8,再次使用CheckDB发现不报协议的错误了。只是报了游标问题。
18、原游标设置为300,扩展游标到2000后,再次尝试CheckDB发现无任何报错出现。
再次尝试重启,发现问题解决。
解决方案
修改\app\product\12.2.0\dbhome_1\network\admin\sqlmet.ora修改为如下参数
bash
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
重启监听后问题解决。
后续总结
与顾问电话沟通发现,此数据库是客户从8i一直升级到12C的,非直接安装的12C版本。所以sqlnet.ora虽然配置了,但依旧不兼容,应该配置为8。
反思
后续遇到数据库连不通的问题,建议使用CheckDBConnection脚本和sysconfig双层校验为准,并且与顾问先行沟通数据库安装状态。