问题背景:
接同事问题协助,在对用户的RAC集群数据库进行修改参数重启操作时,发现使用集群的srvctl工具去关闭或者启动数据库时出现ORA-01017: invalid username/password; logon denied报错,无法通过srvctl工具去启动关闭数据库,但手动的通过sqlplus工具去启动关闭数据库可以正常的完成
问题分析:
使用srvctl工具去关闭启动数据库,会发送请求到集群的crsd进程,crsd进程会转发通过oracle oraagent进程去执行相关的关闭启动数据库操作,查看oraagent_oracle的相关日志文件,可以看到日志一直在持续的报ORA-01017: invalid username/password; logon denied的错误,此外没有其他额外的报错信息
oraagent管理数据库是通过sys用户的操作系统身份证SS_DBA_GRP组去登录的,如果用户的dba组缺失,也会导致用户使用操作系统身份认证登录出现ORA-01017的报错,检查grid,oracle用户的权限是否正常,当前数据库软件定义SS_DBA_GRP为dba组,CRS软件定义SS_DBA_GRP为asmdba组,两个用户都加入了上述的组,权限配置没有问题
检查数据库软件以及CRS软件的sqlnet.ora配置,如果sqlnet.ora配置了SQLNET.AUTHENTICATION_SERVICES=none禁用操作系统身份认证,也会导致出现登录报ORA-01017问题,禁用操作系统身份认证操作在安全等保整改时经常被错误操作
同事一检查果然在CRS软件的$ORACLE_HOME/network/admin/sqlnet.ora
配置文件里面发现了禁用操作系统身份认证配置SQLNET.AUTHENTICATION_
SERVICES=none,让同事把参数去掉,再重新尝试srvctl去启动关闭数据库,本以为去了参数就能恢复,没想到同事反馈还是不行,去掉参数之后报错依旧
查了一下Oracle mos上面类似的相关案例,发现有这样的描述,oraagent是通过beq方式去访问数据库,进程在启动的时候会读取CRS安装目录下的sqlnet.ora配置文件里面的SQLNET.AUTHENTICATION_SERVICES参数配置
这一段描述给了我一个解决问题的方向,推测是不是oraagent进程里面读取到的参数值还是禁用操作系统认证的none选项,虽然现在sqlnet.ora里面已经注释了参数,但oraagent进程其实里面SQLNET.AUTHENTICATION_SERVICES参数依然还是none值
为了验证我的猜想,我在自己的11.2.0.4 RAC集群测试环境进行了如下的实验
在一套正常运行的RAC集群,在CRSD安装目录下的sqlnet.ora里面添加了参数SQLNET.AUTHENTICATION_SERVICES=none禁用操作系统认证,添加完之后通过srvctl关闭启动数据库没有受到影响,可以正常执行,oraagent的后台日志也没有出现ORA-01017的报错
SQLNET.AUTHENTICATION_SERVICES = (NONE)
然后单独把oraagent进程通过kill -9方式重启,只重启oraagent进程,其他集群组件没有操作,重启之后出现了一模一样的错误现象,oraagent开始出现大量的ORA-01017报错,通过srvctl关闭启动数据库也出现ORA-01017报错,删除sqlnet里面的禁用操作系统认证none配置之后,报错依旧,问题同样无法被解决,最后通过kill -9方式再次把oraagent进程重启之后,问题才恢复正常
通过上述测试我们可以确认oraagent在启动的时候会读取CRS安装目录下的sqlnet.ora里面的SQLNET.AUTHENTICATION_SERVICES参数配置,而且仅在进程启动的时候才会读取,进程不会实时的动态读取参数,即使修改了sqlnet.ora的参数配置,进程也不会重新读取参数,要想让oraagent进程重新读取sqlnet.ora的配置参数,只有让进程重启才能读取
问题解决:
知道ORA-01017问题的原因之后,让同事通过kill -9方式对oraagent进行重启,单独的kill -9 oraagent进程并不会影响集群,oraagent进程重启之后,问题得到解决,srvctl启动关闭数据库操作恢复正常,日志也没有再出现ORA-01017的报错
--查询oracle oraagent的pid
$ ps -ef |grep -i oraagent|grep -i oraagent.bin |grep -i oracle |grep -v grep
oracle 39629 1 0 16:17 ? 00:00:05 /u01/app/11.2.0/grid/bin/oraagent.bin
--kill pid重启oraagent进程
$ kill -9 39629