【问题标题】:Oracle listener state blocked after setting SQLNET.ALLOWED_LOGON_VERSION设置 SQLNET.ALLOWED_LOGON_VERSION 后 Oracle 侦听器状态被阻止
【发布时间】:2014-03-02 04:06:33
【问题描述】:

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

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

要处理这个项目,我需要在我的 Mac 上运行一个 Oracle DB,运行 OSX Mountain Lion,唯一明显的解决方案是在 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我可以以任何普通用户身份登录已经设置好了。


现在,诀窍是当我想使用 Java DB 访问框架时,该框架专为与 9i 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 检查服务状态时(我在谷歌上搜索了一下),就会发生这种情况:

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,所以我m 在绑定中。

【问题讨论】:

    标签: java sql oracle oracle9i oracle12c


    【解决方案1】:

    哇,简直,哇。

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

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

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

    然后假设语法是这样的:

    SQLNET.ALLOWED_LOGON_VERSION=(8)
    

    而且,您可以将多个数字(以逗号分隔)放在括号内。这个假设仅仅来自于我对 Oracle DB 或如何在.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,替换为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
    

    【讨论】:

    • 监听器设置不会阻止数据库启动,它们只会阻止远程访问;来自 VM OS 命令行的sqlplus 仍然可以工作。如果您更改侦听器设置,那么您只需要重新启动侦听器,而不是 DB 或 VM;如果您只更新sqlnet.ora,而不是listener.ora,甚至可能不会。 (虽然不知道为什么“哇”,因为它都记录在案 - 如果您查看您正在使用的版本的文档,当然......)
    • VM OS 命令行中的 @AlexPoole sqlplus 不起作用;当我尝试sqlplus connect system/oracle@localhost/orcl 时,它给出了关于听众拒绝连接的类似消息。不过,感谢您提供的数据,我不知道 sqlnet.ora 是专门针对侦听器的配置。 ('哇',因为我有点惭愧,我花了 那么长时间 才意识到我的问题是括号。至于文档,它相当单一且不受欢迎;它似乎适用于有经验的数据库管理员——这很好,我不是这样的人。)
    • 我的意思是sqlplus system/oracle,没有指定连接字符串;不使用 SQL*Net,使用您的$ORACLE_SID 创建一个遗赠连接。如果您在本地使用连接字符串,sqlnet.ora 与客户相关。你不是第一个想到文档的人... *8-)
    【解决方案2】:

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

    SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
    SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
    

    【讨论】:

      猜你喜欢
      • 2014-04-14
      • 2021-08-04
      • 2016-06-14
      • 2011-08-16
      • 1970-01-01
      • 2013-09-03
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多