这是一个相当具体的问题。
我在使用数据库访问框架的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。
答案 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