一、问题描述
一日早上,有项目组同事反馈有套Oracle 19C数据库,其上部署了两个数据库实例,目前数据库可正常登陆,但均无法使用sqlplus / as sysdba连接所有实例,请求排查下原因并尽快解决。
二、处理过程
根据项目组同事所反馈内容,我尝试登陆该数据库服务器,并尝试使用sqlplus / as sysdba登陆数据库实例,正如那位同事所描述,两个实例均无法正常登陆,使用ps -ef|grep smon可以看到两个实例进程也都存在。
该服务器部署了grid,切换至grid用户,asmcmd查看空间剩余很多,sqlplus / as sysasm也能正常登陆。
查看数据库alert等日志,也未发现ORA报错信息。
尝试使用同事所提供的普通用户根据tnsnames.ora连接串使用sqlplus xxx/xxx@xxx也是无法登陆,并且登陆报如下错误:
ERROR:
ORA-01017: invalid username/password; logon denied
之后,使用oracle用户cd 到 $ORACLE_HOME/network/admin目录下,发现该目录下配置了sqlnet.ora,会不会和该文件里配置的内容有关呢。
打开 sqlnet.ora配置文件,发现最下方发现多了一条sqlnet.authentication_services=(NONE),
对于 sqlnet.authentication_services,如果设置不同的值会有相关作用和限制,
对于Linux平台,参数SQLNET.AUTHENTICATION_SERVICES主要是以下几种情况:
(1). sqlnet.ora文件为空,或用#注释掉 --操作系统验证通过,密码文件认证无法通过
(2). SQLNET.AUTHENTICATION_SERVICES = (NTS) --操作系统验证无法通过,密码文件认证也无法通过
(3). SQLNET.AUTHENTICATION_SERVICES = (NONE) --操作系统验证无法通过,密码文件认证也无法通过
(4). SQLNET.AUTHENTICATION_SERVICES = (NONE,NTS) --基于操作系统验证(前后顺序颠倒也一样),密码文件认证也能通过
(5). SQLNET.AUTHENTICATION_SERVICES = (ALL) --操作系统验证通过,密码文件认证无法通过
认定无法登陆跟sqlnet.ora配置SQLNET.AUTHENTICATION_SERVICES = (NONE) 有关。
不清楚该SQLNET.AUTHENTICATION_SERVICES是谁添加的,为何要添加。
三、解决办法
最后将oracle用户下的sqlnet.ora里SQLNET.AUTHENTICATION_SERVICES = (NONE)这段内容注释
重新尝试sqlplus / as sysdba,切换不同实例,均可以正常登陆了,尝试使用普通用户也能正常通过sqlplus正常登陆。
然后通知项目组进行验证测试,项目组反馈已正常。
四、总结
该问题已得到处理,但对处理结果我还不是很满意,因为有其它事也没来得及询问项目组人员,是何时出现这情况,是谁修改的sqlnet.ora文件,之前添加SQLNET.AUTHENTICATION_SERVICES = (NONE)的目前是为什么。
没过多久另一套生产系统出现了类似问题,只是项目组反馈有很多应用无法正常连接数据库,在alert日志里报了很多连接失败的信息,最后排查也是和sqlnet.ora有关。等有时间再详细写一篇该问题处理过程。
对于Oracle监听,还是有很多东西要深入学习。




