暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

客户端连接 12、18c 报ORA-28040和ORA-01017 的解决方法

原创 yuanduobao 2020-11-23
1490

客户端连接 12、18c 报ORA-28040和ORA-01017 的解决方法

问题描述

oracle18c 数据库已经发布,在安装Oracle 18c数据库之后,客户端目前一般还是停留在10G、11G,如果客户端工具的版本是toad、plsql在连接12c、18c就会报如下两个错误:

ORA-28040: No matching authentication protocol

ORA-01017: invalid username/password; logon denied
复制

1601190210945.png

一、ORA-28040报错解析

1601190228111.png

按照官方说法在服务端sqlnet.ora下需要添加如下参数。

SQLNET.ALLOWED_LOGON_VERSION_CLIENT

SQLNET.ALLOWED_LOGON_VERSION_SERVE
复制

注意:参数和等号之间不要有空格,否则有可能参数不生效。

二、处理ORA-28040错误
SQLNET.ALLOWED_LOGON_VERSION=8
或者使用更高版本的客户端。

这里的n默认为11. 第一个参数是客户端连接到服务器的时候启作用,第二个是做为客户端去连接其它数据库的时候启作用。

这里修改如下:

[oracle@host02 admin]$ pwd

/u01/app/oracle/product/18.3.0/dbhome_1/network/admin

[oracle@host02 admin]$ more  sqlnet.ora

#SQLNET.ALLOWED_LOGON_VERSION_SERVER=11

#SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10

SQLNET.ALLOWED_LOGON_VERSION=8

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

SQLNET.ALLOWED_LOGON_VERSION_SERVE=10
复制

修改后使用reload 监听

[oracle@host02 admin]$ lsnrctl

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 13-FEB-2019 15:56:45

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> reload

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

The command completed successfull
复制

三、ORA-01017错误

从错误提示看是用户名或者密码错误,其实用户名和密码没有问题。 这里的问题是我们配置的sqlnet对之前已经存在的帐号并没有生效,他们还保持在之前的兼容性。
1601190327655.png

使用alter修改密码

注意这里虽然SYS并没有改变,但是SYSTEM的版本已经加上了10G。实际上,现在这2个用户都可以连接了:

据Oracle官方的说法,这里是bug,所以如果以低版本的客户端连接18c,需要特别留意这2个错误。

此时sysem及sys就可以连接了。

总结

应该是oracle密码版本写入的时候使用的时11g和12c配置的规则,导致正确密码也无法通过验证。

在sqlnet.ora文件新增了参数后密码虽然支持n以上版本,但是此时由于密码规则事先写入,导致低版本客户端无法识别。

此时只需要alter user_name identified by passwd ;修改一遍即可了。官方明确说了不支持10g以下客户端,虽然是个BUG,但是保险起见还是把低版本客户端升级比较好。

关于SQLNET.ORA中的参数SQLNET.ALLOWED_LOGON_VERSION

一生产库上,alert日志中一直抛出SQLNET.ALLOWED_LOGON_VERSION = 10 被废弃的信息。

该生产库是12c,由于该服务器上存在多个生产库,不敢随便修改此参数,于是在metalink上查找一番:

看到这篇文章:Doc ID 1957995.1

有这么一段话:

This issue is caused by the default setting for allowed logon version in the 12 database.
Note that the SQLNET.ALLOWED_LOGON_VERSION parameter has been deprecated in 12c.
That parameter has been replaced by these:

SQLNET.ALLOWED_LOGON_VERSION_SERVER=n
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n

The default setting for the new parameters is 11. Any client that attempts to connect must
be at version 11 or higher unless these parameters are explicitly set in the server side sqlnet.ora file.

可以看出,该参数在12c中已经被废弃了,被另外两个参数所取代(SQLNET.ALLOWED_LOGON_SERVER,SQLNET.ALLOWED_LOGON_CLIENT)。

接着看下SQLNET.ALLOWED_LOGON_VERSION的作用:

看文章:Doc ID 402193.1

Use the sqlnet.ora parameter SQLNET.ALLOWED_LOGON_VERSION to specify which authentication protocols are allowed by the client or database. This parameter defines the minimum Client Oracle version that is allowed to connect to the database. This parameter has been introduced in 10g which replaces the init.ora parameter DB_ALLOWED_LOGON_VERSION.
即该参数用来限制可以连接到数据库服务器上的最小客户端版本,比如设置值为10,即10g,11g等以上客户端版本可以连接到数据库服务器上。

参考:
https://blog.csdn.net/u013456370/article/details/76994624

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论