4

在开发过程中,我发现数据库有大量的活动连接:

SELECT username, COUNT(*) FROM v$session GROUP BY username;

为了找到谁实际保持连接,我想获取一个 IP 地址列表。

在一般的网络搜索和阅读官方文档期间,我构建了查询:

SELECT username, seconds_in_wait, machine, port, terminal, program, module, service_name
  FROM v$session
  WHERE type = 'USER';

machine最重要的部分在哪里select。但不幸的是,machine字段显示客户端操作系统已知的主机名

互联网上充满了使用UTL_INADDR.GET_HOST_ADDRESS的建议,这在我的情况下不适用。首先是因为ORA-24247:网络访问被访问控制列表 (ACL) 拒绝,其次是因为客户端操作系统主机名通常定义在/etc/hostname中,并且对于我们内部网中的 DNS 服务器不可用...

任何其他方式来检索到 Oracle DB 的打开会话的 IP(数据库实例在任何情况下都保存有关其套接字的信息......)。

更新

我在受信任的 Intranet 下,但网络层次结构未知。

我试图找出哪些应用程序使用了我的表(几个应用程序服务器,我不知道所有这些)。其中一些过度使用连接,需要修复。但首先应该确定它们...

4

4 回答 4

4

请记住,Oracle 会话不需要知道,当然也不需要信任您来自的客户端名称/IP 地址;它位于网络传输层之上,并不关心您是通过 TCP/IP 还是其他方式连接。(我什至不确定侦听器是否必须传递信息,或者它是否有效地传递现成的套接字)。如您所见,machine这正是客户端声明的内容,例如视图program中的其他字段v$session;它可能与 DNS 或您的服务器可以解析的任何东西没有任何相似之处/etc/hosts,特别是如果客户端是 Windows 机器。

您可以做的是,在 Unix/Linux 级别(因为您指的是 /etc/hosts,我假设您不在 Windows 上),查找port并查看显示的地址;例如v$session显示我port的 as 50527,所以如果netstat -an | grep 50527我看到:

tcp  0  0  192.168.1.1:1521  192.168.1.23:50527  ESTABLISHED

所以我可以看到我从192.168.1.23. 如果您在服务器上运行 SQL*Plus,您可以使用host命令来执行此操作,但这仍然有点不方便。如果您需要定期执行此操作,并且无法选择添加登录触发器以将其捕获到审计表中,并且您确实必须从数据库中执行此操作,您可能可以编写一个 Java 存储过程来执行查找那个端口给你。但是编写一个shell脚本来查询port数字v$session并以这种方式进行查找可能更容易。

于 2013-02-25T17:13:10.710 回答
2

感谢大家深入研究我的问题(这仍然是通用的,不完全是我的!!)。

只是简短的回答:您无法从 Oracle 系统表中获得真正的 IP。

对于此任务,您可以使用通用实用程序,例如netstatlsof -p <pid-of-oracle>但仅在服务器端

一些帮助可以来自v$session.port价值观...

助手的一个好建议 - 使用数据库客户的好名字。它们填充到v$session表行中:

machine, terminal, program, module, service_name

所以他们可以帮助识别客户......

于 2013-02-25T19:24:47.550 回答
2

传入连接的 IP 地址通常可以在侦听器日志中找到。这就是我在需要时跟踪此类信息的方式。

于 2013-03-22T18:36:15.187 回答
1

当登录触发器不存在 AFAIK 时,我发现了 2001 年的审核脚本。它解析 SYS.AUD$ 的 COMMENT$TEXT 列,其中 ACTION#=100 以获取客户端的 IP 地址。该列仍然包含Authenticated by: DATABASE; 客户端地址: (ADDRESS=(PROTOCOL=tcp)(HOST= aaaa )(PORT= p ))在我们的环境中。

于 2017-11-08T11:29:36.840 回答