获取建立连接的IP地址到Oracle 11

问题描述:

在开发过程中我发现,数据库必须通过大量的生活连接:获取建立连接的IP地址到Oracle 11

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

为了找到究竟是谁持有方面,我想获得IP地址的列表。

在通用网络搜索和阅读official docs我建立查询:

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

其中machineselect最重要的部分。但不幸的是machine字段显示客户端操作系统已知的主机名称

互联网充满推荐使用UTL_INADDR.GET_HOST_ADDRESS这是不适用于我的情况。首先是因为ORA-24247:网络访问的访问控制列表(ACL)并否认其次是因为客户端操作系统的主机名通常的/ etc /主机名定义,在我们的内部网不提供给DNS服务器.. 。

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

UPDATE

下我信任内网,但未知的网络层次。

而我试图找到哪些应用程序使用我的表(几个应用程序服务器,我不知道他们全部)。其中一些过度使用连接并需要修复。但首先他们应该被确定...

+0

您可以查询'sys_context('USERENV','IP_ADDRESS')',但只能在用户的会话中使用 - 所以对您尝试执行的操作没有帮助我想,除非您能够添加登录触发器会将包含该值的会话信息记录到您自己的审计表中? – 2013-02-25 14:38:37

+0

嗯...我希望Oracle有一些易于查询的内置解决方案... – gavenkoa 2013-02-25 14:46:14

+0

获取ACL的权限有什么问题? – tbone 2013-02-25 14:47:34

请记住,Oracle会话不需要知道,并且当然不需要信任您来自的客户端名称/ IP地址;它位于网络传输层之上,并不关心你是否通过TCP/IP或其他方式连接。 (我甚至不确定听众是否必须传递信息,或者如果它实际上传递了现成的套接字)。正如您所看到的,machine正是客户声明的内容,如programv$session视图中的其他字段;它可能不会与DNS或服务器的/etc/hosts可以解决的任何事情相似,特别是如果客户端是Windows盒子。你可以做的是,在Unix/Linux级别(因为你指的是/ etc/hosts,我假设你不在Windows上),查找port并查看显示的地址;例如v$session显示了我port50527,所以如果我做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脚本来查询v$session中的port号码并进行查找可能更容易。

+0

我是否正确理解你建议在Oracle服务器上运行'netstat'?我只是无法访问它(当我向他请求这样的许可时,DBA会被嘲笑......)。感谢我的问题! +1 – gavenkoa 2013-02-25 19:09:20

+0

@gavenkoa - 是的,在服务器上;我从中得知,你并没有在服务器上运行SQL * Plus。您可以获得在数据库中运行Java以获取该信息的权限,但可能不会。我不确定我是否理解您的最终目标是什么,为什么实时连接的数量很重要,或者您将如何处理IP。也许DBA可以监控这个(如果你提供了一个脚本!?),并将你需要的输出发送给你,特别是如果它是一次性调查? – 2013-02-25 19:15:01

+0

@AlexPloole我尝试查找导致连接泄漏的服务器。似乎是DBA的工作,而不是我的工作。再次感谢您的解释! – gavenkoa 2013-02-25 19:20:08

感谢所有挖掘到我的问题(这仍然是通用的,不完全是我的!!)。

只是简短的回答:你不能从Oracle系统表中获得真正的IP。

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

一些帮助可以来自v$session.port值...从助手

一个很好的建议 - 使用来自DB客户端的好名字。它们填充到v$session表行:

machine, terminal, program, module, service_name 

,使他们能够帮助确定客户...

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

+0

感谢您的信息!但我是常规开发人员,并没有SSH访问服务器((无论如何+1! – gavenkoa 2013-03-23 19:49:57

我发现我的审计脚本从2001年登录触发器不存在AFAIK。它解析SYS.AUD $的COMMENT $ TEXT列,其中ACTION#= 100以获取客户端的IP地址。该列仍包含身份验证者:DATABASE;客户端地址:(ADDRESS =(PROTOCOL = tcp)(HOST = a.a.a.a)(PORT = p))在我们的环境中。