1

这是一个比较具体的问题。

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

为了处理这个项目,我需要在我的 Mac 上运行一个 Oracle DB,运行 OSX Mountain Lion,唯一明显的解决方案是在 VM 中运行它。因此,我从这里下载了 OTN 开发人员日 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

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

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

并添加以下行:

SQLNET.ALLOWED_LOGON_VERSION=(9)

(请注意,我也尝试过(8), as well as(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 检查服务状态时(我用谷歌搜索了一下),会发生这种情况:

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

4

2 回答 2

2

哇,简直了,哇。

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

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

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

然后假设语法是这样的:

SQLNET.ALLOWED_LOGON_VERSION=(8)

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

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

SQLNET.ALLOWED_LOGON_VERSION=8

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

进一步搜索显示,此处ALLOWED_LOGON_VERSION针对 Oracle DB 11 进行了描述,并且在几乎所有有关,的帖子中都提到过,在 12c 中已弃用,由and代替(后者在此处详述)。ORA-28040: No matching authentication protocolALLOWED_LOGON_VERSION_CLIENTALLOWED_LOGON_VERSION_SERVER

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

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

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
于 2014-03-02T05:31:23.330 回答
0

Mac、Java 8 和 Oracle 12c 需要“sqlnet.ora”中的以下条目

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
于 2016-02-04T09:55:14.580 回答