Oracle 12.2的ORA-01017/ORA-28040解惑

最近安装了一套RHEL 7.2 x86-86的Oracle 12.2.0.1单机测试库,导完数据交给业务后,业务反馈使用PL/SQL Developer连接时报如下错误:

赶紧查了查MOS,原来在默认情况下Oracle 12.2对客户端版本有限制,主要是由sqlnet.ora中的以下两个参数控制:

SQLNET.ALLOWED_LOGON_VERSION_SERVER=n SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n

1

2

3

SQLNET.ALLOWED_LOGON_VERSION_SERVER=n

 

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n

这两个参数默认是11,表明默认只允许11g的客户端进行连接,考虑到很多PC端 plsql developer用的客户端都是10g,把这两个参数改为10:

SQLNET.ALLOWED_LOGON_VERSION_SERVER=10 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10

1

2

3

SQLNET.ALLOWED_LOGON_VERSION_SERVER=10

 

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10

SQLNET.ALLOWED_LOGON_VERSION_CLIENT参数主要是当数据库作为dblink的客户端时使用,设置后无需重启监听和数据库就可以生效。对于RAC,Oracle读取的这两个参数是在RDBMS的ORACLE_HOME里,而不是GRID的ORACLE_HOME里。

解决完这个问题,有些客户端可以连接了,但是有些客户端报:ORA-01017: invalid username/password。于是我做了一些测试,发现在10.2.0.4版本的客户端连接会报ORA-01017,而10.2.0.5的版本可以正常连接,11.2.0.3、11.2.0.4和12.2.0.1的客户端也都没有问题,其它版本没有找到相关客户端,也就没有测试。

这里已经设置了10g客户端可以连接12.2的数据库,但为什么10.2.0.4的客户端还会报ORA-01017口令错误,而10.2.0.5客户端就可以连接。

经过检查,在Oracle 12c的数据库中(其实从11g开始就有了),dba_users视图上有个字段是password_versions,该值情况如下:

1

2

3

4

5

6

7

8

9

10

SQL> set linesize 200

SQL> column username format a15

SQL> column account_status format a18

SQL> column default_tablespace format a25

SQL> column password_versions format a20

SQL> select username, account_status, default_tablespace, created, password_versions from dba_users where username = 'CRM';

 

USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE CREATED             PASSWORD_VERSIONS

-------- -------------- ------------------ ------------------- --------------------

CRM      OPEN           TBS_CRM_TS_S1      2017-06-06 21:36:19 11G 12C

password_versions表明当前CRM用户口令的认证方式是11g和12c,所以10.2.0.4客户端连接出现了问题。那如何支持10g的认证方式呢,其实很简单,只要确认sqlnet.ora中的SQLNET.ALLOWED_LOGON_VERSION_SERVER和SQLNET.ALLOWED_LOGON_VERSION_CLIENT已经设置为10,然后使用alert user xxx identified by xxxxxx后,PASSWORD_VERSIONS就支持10g的认证方式了,如下:

SQL> set linesize 200 SQL> column username format a15 SQL> column account_status format a18 SQL> column default_tablespace format a25 SQL> column password_versions format a20 SQL> select username, account_status, default_tablespace, created, password_versions from dba_users where username = 'CRM'; USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE CREATED PASSWORD_VERSIONS -------- -------------- ------------------ ------------------- -------------------- CRM OPEN TBS_CRM_TS_S1 2017-06-06 21:36:19 10G 11G 12C

1

2

3

4

5

6

7

8

9

10

SQL> set linesize 200

SQL> column username format a15

SQL> column account_status format a18

SQL> column default_tablespace format a25

SQL> column password_versions format a20

SQL> select username, account_status, default_tablespace, created, password_versions from dba_users where username = 'CRM';

 

USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE CREATED             PASSWORD_VERSIONS

-------- -------------- ------------------ ------------------- --------------------

CRM      OPEN           TBS_CRM_TS_S1      2017-06-06 21:36:19 10G 11G 12C

所以整个问题的过程如下:在Oracle 12c上安装建库并迁移数据后,由于前期未设置SQLNET.ALLOWED_LOGON_VERSION_SERVER和SQLNET.ALLOWED_LOGON_VERSION_CLIENT为10,导致创建的用户不支持10g的口令认证方式。而修改这两个sqlnet参数后,数据库里用户的口令认证方式未发生变化,所以10.2.0.4客户端连接不上服务器,报ORA-01017。使用alert user xxx identified by xxxxxx修改口令后,由于sqlnet中的这两个参数已经修改为支持10g客户端的连接,所以dba_user中的password_versions也相应地修改为支持10g的认证方式,所以10.2.0.4版本的客户就可以连接数据库了。

所以当一些客户端是10.2.0.4的应用需要注意了,如果数据库服务器使用数据迁移的方式升级到Oracle 12c,需要注意在Oracle 12c中用户口令是否支持10g的认证方式,否则迁移后就报默名其妙的口令错误,10.2.0.5版本的客户端测试没有问题。

转载于:https://my.oschina.net/u/3506264/blog/994228

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值