oracle - DBeaver+Oracle:关闭IP到主机名解析
问题描述
出于某种奇怪的原因,带有 Oracle 驱动程序 12.2.0.1 的 DBeaver 21.0.2 似乎将配置的 IP 地址作为主机,将其转换为主机名,然后使用该主机名进一步用于连接到数据库。
这显然是不希望的,因为我从外部工作场所访问该数据库并且所有额外的网络都在 IP 地址上进行,这显然是我要走的路。
更奇怪的是,该决议似乎发生在建立连接之后。我的意思是我有一次在服务名称中有错字,而我得到了 ORA-12514。一旦我修正了那个错字,我就回到了主机名解析问题,它没有 ORA 编号。所以这可能是 DBeaver 中的东西。
DBeaver 的错误协议:
java.net.UnknownHostException: myunknowndbhost.sjngm.com
at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(Unknown Source)
at java.base/java.net.InetAddress.getAddressesFromNameService(Unknown Source)
at java.base/java.net.InetAddress$NameServiceAddresses.get(Unknown Source)
at java.base/java.net.InetAddress.getAllByName0(Unknown Source)
at java.base/java.net.InetAddress.getAllByName(Unknown Source)
at java.base/java.net.InetAddress.getAllByName(Unknown Source)
at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:126)
at oracle.net.nt.ConnOption.connect(ConnOption.java:161)
at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:470)
at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:521)
at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:660)
at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:639)
at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:189)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:317)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1438)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.lambda$0(JDBCDataSource.java:176)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.openConnection(JDBCDataSource.java:195)
at org.jkiss.dbeaver.ext.oracle.model.OracleDataSource.openConnection(OracleDataSource.java:150)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext.connect(JDBCExecutionContext.java:101)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.initializeMainContext(JDBCRemoteInstance.java:100)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.<init>(JDBCRemoteInstance.java:59)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.initializeRemoteInstance(JDBCDataSource.java:109)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.<init>(JDBCDataSource.java:97)
at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.<init>(JDBCDataSource.java:89)
at org.jkiss.dbeaver.ext.oracle.model.OracleDataSource.<init>(OracleDataSource.java:84)
at org.jkiss.dbeaver.ext.oracle.OracleDataSourceProvider.openDataSource(OracleDataSourceProvider.java:147)
at org.jkiss.dbeaver.registry.DataSourceDescriptor.connect(DataSourceDescriptor.java:896)
at org.jkiss.dbeaver.runtime.jobs.ConnectJob.run(ConnectJob.java:70)
at org.jkiss.dbeaver.runtime.jobs.ConnectionTestJob.run(ConnectionTestJob.java:103)
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
所以问题是:我如何关闭这个主机名解析?
解决方案
这可能是 Oracle 客户端行为...在用户身份验证期间,所有 Oracle 数据库客户端都需要向服务器报告“MACHINE”变量,描述客户端的主机名/IP - 这是数据库视图machine
列中报告的内容。v$session
而且我认为 JDBC 瘦客户端会在必要时进行反向 DNS 查找以尝试填充该变量。
您可以尝试在 DBeaver 中设置v$session.machine
OracleConnection 属性...,编辑您的连接,单击“连接设置”页面上的“编辑驱动程序设置”,单击“驱动程序属性”选项卡,然后添加一个以v$session.machine
您想要的任何名称命名的新属性作为值.
或者您可以尝试将ORACLE_HOSTNAME
环境变量设置为您的主机名。我不清楚这是否会被 Oracle JDBC 驱动程序接收,但这个文档可能暗示它可以提供帮助?
您也可以尝试在 HOSTS 文件中为您的 IP 地址添加主机名。这似乎最有可能解决这个问题,但它是最烦人的实现选项。
推荐阅读
- spring-integration - 如何将自定义标头从 spring-cloud-stream(aws kinesis binder)发送到“旧版”spring 集成使用者
- sql - 如何将 WHERE 子句用于复杂的 JOIN 查询
- mysql - MySQL 存储过程在错误时无法回滚
- reactjs - 在 Material-UI v5 中,我应该更喜欢 css 道具而不是 sx 道具,反之亦然?
- r - 如何修复 plm 包中的 pgmm 错误
- python - Discord Py - 是否可以通过 discord py 在不使用角色的情况下将成员添加到私人频道?
- docker - Rootless Docker:在没有 sudo 的情况下将文件写入卷挂载时权限被拒绝
- javascript - 在 Vuejs 的 v-for 中使用 v-if 显示条件按钮
- javascript - 错误:未捕获的 ReferenceError:onChangeAssignedGroup 未在 HTMLSelectElement.onchange 中定义
- javascript - clearTimeout() 在 JavaScript 中不起作用