背景:
ORACLE等系统软件的升级换代一直是运维人员又爱又怕的事,爱的是升级后亮点更多,性能更强大、更稳定。怕的事是新的系统总有一些我们不知道的坑,在运维过程中会给我们制造一些小麻烦,所以能快速解决这些问题是运维需要关注的。ORACLE12C在集群,ASM以及RAC和RMAN方面新增了一些特性和改进,在数据库性能调优、语句执行数据库管理等方面做了完善。有些客户在采购新服务器时也只能直接就安装ORACLE12C,本文先对12C安装后,因为密码版本策略引起的客户端与服务器端无法连接的现象与解决。
案例现象:
客户安装了ORACLE12C版本的数据库软件,采用备份恢复工具恢复完实例后,使用之前的ORACLE11G版本客户端机器,连接访问数据库时,发现报如下错误
ORA-28040: No matching authentication protocol error
ORA-03134: Connections to this server version are no longer supported
同样,在WEB服务器上启动JBOSS连接后,也报如下错误:
故障排查
1、 查了一下,是由于ORACLE12C中的安全认证协议的版本不匹配导致。
ORACLE12C默认的安全认证协议版本是12,使用低版本的如11G、10G客户端采用较早的JDBC驱动去连接时,就会因为安全认证协议版本不符合,导致连接失败。这个通过查询12C数据库中用户的密码版本兼容策略,也能进行确认。
Select * from dba_users;
其中如果没有10G、11G的版本的信息,则不支持低版本的客户端进行连接。
那么如何快速修改允许低版本的数据库进行连接访问,在服务器的监听配置文件中,增加允许低版本的数据库连接访问的参数。
1) 需要在服务器端的$ORACLE_HOME\NETWORK\ADMIN\sqlnet.ora中配置:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
2)然后重启监听
注:$ORACLE_HOME 为ORACLE软件的安装目录,如:/opt/oracle/product/12.1.0/db_1
2、可是重新启动JBOSS后,却又报了另外一个错误:
ORA-28000:the account is locked
说明账户被锁定,一般这种是由于客户端尝试访问数据库时,由于密码不对尝试次数过多,造成账户被锁定。
由于ORACLE12C默认的密码策略,是默认大小写敏感,即使是从原库恢复过来的。所以对于该问题,要进行调整策略,并解锁才有正常访问
步骤1:关闭JBOSS与银证通讯机、TASKSERVER等涉及访问数据库的程序
步骤2:解锁账户
--生成解锁语句,去解锁用户
select'alter user '||username||' account unlock;'
from dba_users t where t.account_status='LOCKED'and t.DEFAULT_TABLESPACE like'TBS_%'
――用该语句的查询结果,复制到SQL窗口中进行执行解锁
3、以SYSDBA权限用户修改密码大小写敏感参数
alter system set sec_case_sensitive_logon=false;
4、如果是10G客户端,重设ORACLE用户密码,手动将数据库中的用户密码修改。
select'alter user '||username||' identified by '||’password’||’;’
from dba_users t where t.account_status='LOCKED'and t.DEFAULT_TABLESPACE like'TBS_%';
注:password 为要修改的密码字符
如果password非原先默认的密码,则需要通过新意DBPASS工具进行同步修改JBOSS中连接与数据库用户,以及修改投保、银证等涉及数据库用户访问的连接配置
5、启动JBOSS和各项程序,故障解决,正常访问。
运维提醒
1、 在升级数据库到12C版本后,建议升级各客户端的ORACE client版本,与数据库保持一致,或者加入上述参数,可以避免出现无法连接的情况发生。
2、 如果采用备份恢复软件进行恢复后,如果是11G、12C版本,首先通过
show parameter sec_case_sensitive_logon 检查大小写敏感参数,如果是TRUE,要默认的修改为FALSE。或者对于需要保持大小写敏感管理要求的客户,可以去确认修改相应的密码,再启动相应的JBOSS等中间件程序,进行数据库的连接访问。
参考技术说明
参数详解:
SQLNET.ALLOWED_LOGON_VERSION_CLIENT
与
SQLNET.ALLOWED_LOGON_VERSION_SERVER
这个参数是12C新引进的参数。它表示Cp在向Sp发送认证(authentication)申请时,所使用的最低版本的认证协议。
注意此处的认证协议版本并不等同于Oracle Database的版本。那不同的认证协议版本主要区别在哪儿呢?
除了协议语义上的区别,最重要的区别在于不同认证协议的版本对应着不同的database version,而不同的database version则可能使用不同的hash算法对密码进行加密。不同的hash算法就是不同的password_version,这个可以从dba_users字典表的password_versions字段中得到说明。

ORACLE 12C R2中默认的认证协议是12, 即便是sqlnet.ora文件不存在默认值同样生效,12是一种区分大小写密码的认证,是一种新的认证协议。
sqlnet.allowed_logon_version_server 和sqlnet.allowed_logon_version_client配置的值是最小认证版本的值,如数据库是12c, sqlnet.allowed_logon_version_server=10, 那10g,11g,12c的client都可以访问,包含10g对应的JDBC驱动包。
sqlnet.allowed_logon_version_server是配置在数据库服务器(被访问端)的DB $ORACLE_HOME的sqlnet.ora(不是GI HOME),在12.2版本有效值应该是8,9,10,11,12,12A,当ALLOWED_LOGON_VERSION_SERVER的值设为12时,只有已经应用了关键补丁更新CPUOct2012或更高版本的客户端,或者具有等同更新的11.2.0.3客户端版本才能连接到服务器。
如果数据库做为一种CLIENT 使用DB LINK时同要需要在创建dblink数据库端sqlnet.ora中配置sqlnet.allowed_logon_version_client参数。

如果已完成了上面的修改,但是登录提示密码错误ORA-1017,同常还需要与SEC_CASE_SENSITIVE_LOGON参数配合。另外如果在12.2数据库中创建的用户密码版本默认为‘11G 12C’,这是一种排除了10g密码认证的版本,因为登陆用户没有10G的密码版本,所以使用10g或更老client导致报错ORA-1017。这类问题的解决方法是重新修改一次密码。