Io 异常:Oracle 云中的 Oracle 错误 ORA-12650

Io exception: Oracle Error ORA-12650 in Oracle Cloud

我一直在为我的数据库机器 (Oracle 11g) 使用 Oracle 云 PAAS linux 服务器,并拥有 linux 应用程序服务器,我可以 运行 我的所有 Java应用程序。

假设我有基于 spring 的 Web 应用程序,它可以连接云数据库机器。我试图访问 Toad for oracle 中的架构,它按预期工作,但是当我尝试访问数据库以从应用程序中检索数据时,它给出了以下错误。

java.sql.SQLException: Io exception: Oracle Error ORA-12650
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:420)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at GetConnection.main(GetConnection.java:35)

我还尝试将服务访问从 SID 扩展到数据库机器中的服务名称。仍然给出相同的错误。相同的代码在我们设置的另一台云机器上运行良好。但是这个云机是oracle团队做的,大部分东西都是默认的。

请分享您解决此问题的建议。

这个问题是因为 Oracle DB 机器加密 ENCRYPTION_SERVER 设置。据我所知,这是默认设置并将其设置为启用,当我们将其设置为 disabled 或注释该行时,应用程序将按预期工作。以下是供参考的文件名,

Filename : sqlnet.ora (We have to disable ENCRYPTION_SERVER settings)
File Location : ../oracle/product/11.2.0/dbhome_1/network/admin 

希望对大家有所帮助!

它对我一点帮助都没有。实际上,我遵循了您的解决方案,但最终遇到了另一个比试图解决的错误更为严重和严重的错误。 让我解释。首先,您提到的值 "disabled" 甚至不是该参数的可接受值。根据 Oracle (Oracle Docs),这些是任何人都可以使用的公认值:

SQLNET.ENCRYPTION_SERVER 目的

为数据库服务器打开加密。

默认

已接受

  • accepted: 如果对方需要或要求启用安全服务。

  • rejected: 禁用安全服务,即使对方要求。

  • requested: 在对方允许的情况下开启安全服务

  • required:开启安全服务,如果对方没有开启安全服务则禁止连接

例子

SQLNET.ENCRYPTION_SERVER=accepted

在我的例子中是一个 12c Oracle 云数据库,默认设置为 "required" 在尝试启动我的应用程序时给我错误 "Io exception: Oracle Error ORA-12650"。 将参数设置为 "accepted" 解决了问题并成功启动了我的应用程序。 如果仍然出现错误,您还可以将以下参数设置为已接受: SQLNET.CRYPTO_CHECKSUM_SERVER = 接受 如果您看到 sqlnet.ora 中的值设置为 "required".

请记住,我的应用程序以及我的 OCI 设置仅用于测试目的,它们不打算用于生产环境。将 SQLNET.ENCRYPTION_SERVERSQLNET.CRYPTO_CHECKSUM_SERVER 的值设置为 "accepted" 将显着降低数据库的安全性,使其容易受到任何有权访问它的应用程序的攻击。最好的情况是修改您的应用程序以使用 ENCRYPTION 作为 "required"。

将 OJDBC jar 降级到版本 7 也可以 - 在依赖文件中用 ojdbc7.jar 替换更高版本(ojdbc14.jar 是我的罪魁祸首)