这是一个相当具体的问题。
我正在使用数据库访问框架的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_CLIENT
和ALLOWED_LOGON_VERSION_SERVER
代替(后者详细描述here >)。将这两个都设置为8可以解决我的问题,并使基于9i的库能够连接到12c数据库!好极了!
具体来说,要添加到
sqlnet.ora
文件的行是:SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8