gav*_*koa 4 oracle sqlplus ora-24247
在开发过程中,我发现数据库有大量活动连接:
SELECT username, COUNT(*) FROM v$session GROUP BY username;
Run Code Online (Sandbox Code Playgroud)
为了找到真正保持连接的人,我想获取 IP 地址列表。
在一般网络搜索和阅读官方文档期间,我构建查询:
SELECT username, seconds_in_wait, machine, port, terminal, program, module, service_name
FROM v$session
WHERE type = 'USER';
Run Code Online (Sandbox Code Playgroud)
其中machine最重要的部分是select. 但不幸的是,machine字段显示客户端操作系统已知的主机名。
互联网上充斥着使用UTL_INADDR.GET_HOST_ADDRESS 的建议,但这不适用于我的情况。首先是因为ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝,其次是因为客户端操作系统主机名通常在/etc/hostname中定义,并且不可用于我们 Intranet 中的 DNS 服务器...
任何其他方式检索 Oracle DB 的打开会话的 IP(数据库实例在任何情况下都保存有关其套接字的信息...)。
更新
我在受信任的 Intranet 下,但网络层次结构未知。
我尝试查找哪些应用程序使用我的表(几个应用程序服务器,我不知道所有这些)。其中一些过度使用连接,需要修复。但首先应该确定它们...
请记住,Oracle 会话不需要知道,当然也不需要信任您来自的客户端名称/IP 地址;它位于网络传输层之上,并不真正关心您是通过 TCP/IP 还是其他方式进行连接。(我什至不确定侦听器是否必须传递信息,或者它是否有效地传递现成的套接字)。正如您所看到的,这machine正是客户端声明的内容,例如视图program中的其他字段v$session;它可能与 DNS 或您的服务器/etc/hosts可以解析的任何内容没有任何相似之处,特别是如果客户端是 Windows 机器。
你可以做的是,在 Unix/Linux 级别(因为你引用了 /etc/hosts,我假设你不在 Windows 上),查找port并查看显示的地址;例如v$session显示我的portas 50527,所以如果我这样做netstat -an | grep 50527我会看到:
tcp 0 0 192.168.1.1:1521 192.168.1.23:50527 ESTABLISHED
Run Code Online (Sandbox Code Playgroud)
所以我可以看到我已从 进行连接192.168.1.23。如果您在服务器上运行 SQL*Plus,则可以使用host命令来完成此操作,但这仍然有点不方便。如果您需要定期执行此操作,并且添加登录触发器以将其捕获到审核表中并不是一个选项,并且您确实必须从数据库中执行此操作,那么您可能可以编写一个 Java 存储过程来进行查找那个端口给你。port但编写一个 shell 脚本来查询数字v$session并以这种方式进行查找可能更容易。