设置SQLNET.ALLOWED_LOGON_VERSION后,Oracle侦听器状态被阻止

时间:2014-03-02 04:06:34

标签: java sql oracle oracle9i oracle12c

这是一个相当具体的问题。

我在使用数据库访问框架的Java项目中做了一些工作,最初设计用于Oracle DB 9i。

要处理这个项目,我需要在我的Mac上安装Oracle数据库,运行OSX Mountain Lion,唯一明显的解决方案是在虚拟机中运行它。因此,我从here下载了OTN Developer Day VM,其中包含Oracle DB 12c实例。

在跳过各种环节之后,我已经让Eclipse / Tomcat / Servlets设置为使用jdbc7驱动程序与12c数据库通信,我从Oracle站点下载了该驱动程序。一切都按预期工作,作为一个注释,Oracle SQL Developer可以很好地连接到它。

这里是我使用的连接字符串:jdbc:oracle:thin:@localhost:1521/pdb1我可以作为我在默认可插拔数据库中创建的本地用户登录,或者使用连接字符串jdbc:oracle:thin:@localhost:1521:orcl登录我可以以任何已设置的常用用户身份登录。


现在,诀窍在于我想使用专为9i数据库设计的Java DB访问框架。我收到错误:ORA-28040: No matching authentication protocol

根据我能找到的内容,例如this Oracle线程,我的12c数据库未配置为允许9i样式的身份验证(由于9i中的安全漏洞)。所以要解决这个问题,我需要通过转到这个文件来设置我的数据库:

/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora

并添加以下行:

SQLNET.ALLOWED_LOGON_VERSION=(9)

(请注意,我还尝试了(8),以及(12,11,10,9,8,7)和其他此类奇怪的事情,我仍然会遇到以下情况。我还看过SQLNET_ALLOWED...,强调而不是期限,但我认为这适用于较旧的Oracle数据库版本。)

当我执行此操作并重新启动VM时,我无法再连接到数据库。当我尝试连接到pdb1时,我得到:

An error was encountered performing the requested operation:

IO Error: The Network Adapter could not establish the connection

Vendor code 17002

当我尝试连接到orcl时,我得到:

An error was encountered performing the requested operation:

Listener refused the connection with the following error:
ORA-12528, TNS:listener: all appropriate instances are blocking new connections 

Vendor code 12528

当我进入VM中的终端并使用lsnrctl检查服务的状态时(我发现了一些谷歌搜索)会发生这种情况:

Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully
LSNRCTL> 

不幸的是,我在Oracle数据库和数据库管理方面一般都很轻量级;我更愿意简单地编写代码并让数据库只是工作,但我确实需要让这个数据库访问框架工作,而我只有Oracle 12c的副本,而不是9i,所以我&# 39; m in a bind。

2 个答案:

答案 0 :(得分:2)

哇,哇,哇。

首先,粗略猜测一下,调整sqlnet.ora文件后我无法再访问数据库的原因是我放入该文件的设置无效,导致数据库无法启动完全没有。

其次,这里的基本问题是我看到了这样的信息:

https://community.oracle.com/message/10155459#10155459

然后假设语法是这样的:

SQLNET.ALLOWED_LOGON_VERSION=(8)

并且,您可以在括号内放置多个以逗号分隔的数字。这个假设仅仅来自于我对Oracle数据库一无所知或者如何在.ora文件中设置变量。我不知道括号在某些情况下是否有效,但显然不是这种情况。

通过删除括号,DB正常启动:

SQLNET.ALLOWED_LOGON_VERSION=8

使用上述设置重新启动数据库,所有连接都正常。但是,我的基于9i的DB-access-library仍会返回相同的错误。

进一步搜索显示ALLOWED_LOGON_VERSION,为Oracle DB 11描述here,并在几乎所有关于ORA-28040: No matching authentication protocol的帖子中提到,deprecated in 12c,由{{替换1}}和ALLOWED_LOGON_VERSION_CLIENT(后者详细here)。

将这两个设置为8解决了我的问题,并启用了基于9i的库连接到我的12c数据库!耶!

具体来说,要添加到ALLOWED_LOGON_VERSION_SERVER文件的行是:

sqlnet.ora

答案 1 :(得分:0)

Mac,Java 8和Oracle 12c需要在“sqlnet.ora”中输入以下内容

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8