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

我正在使用数据库访问框架的Java项目中做一些工作,该数据库访问框架最初旨在与Oracle DB 9i一起使用。

为了进行该项目,我需要在Mac上运行OSX Mountain Lion的Oracle数据库,唯一明显的解决方案是在VM中运行它。因此,我从here下载了OTN开发人员日VM,该VM随Oracle DB 12c实例一起提供。

经历了种种麻烦之后,我获得了Eclipse / Tomcat / Servlets设置,可以使用从Oracle网站下载的jdbc7驱动程序与12c数据库进行通信。一切都按预期工作,并且请注意,Oracle SQL Developer可以正常连接。

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



现在,诀窍在于当我想使用为9i DB设计的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 DB版本。)

执行此操作并重新启动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检查服务状态时(我发现了一些Google搜索),就会发生这种情况:

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,所以我处于绑定状态。

最佳答案

哇,简直是,哇。

首先,粗略地猜测,调整sqlnet.ora文件后我无法再访问数据库的原因是,我放入该文件的设置无效,并且根本无法启动数据库。

其次,这里的基本问题是我看到了以下消息:

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

然后假设语法是这样的:

SQLNET.ALLOWED_LOGON_VERSION=(8)


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

通过删除括号,数据库将正常重新启动:

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,由ALLOWED_LOGON_VERSION_CLIENTALLOWED_LOGON_VERSION_SERVER代替(后者详细描述here >)。

将这两个都设置为8可以解决我的问题,并使基于9i的库能够连接到12c数据库!好极了!

具体来说,要添加到sqlnet.ora文件的行是:

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8

09-26 08:10