获取已建立的Oracle 11连接的IP地址
在开发过程中,我发现数据库有大量的生命连接: 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'; 机器是选择中最重要的部分.但不幸的是,机器字段显示客户端操作系统已知的主机名. 互联网充满了建议使用UTL_INADDR.GET_HOST_ADDRESS,这在我的情况下是不适用的.首先是因为ORA-24247:访问控制列表(ACL)拒绝网络访问,其次是因为客户端操作系统主机名通常在/ etc / hostname中定义,并且在我们的Intranet中不可用于DNS服务器… 检索到Oracle DB的开放会话的IP的任何其他方法(数据库实例在任何情况下都保存有关其套接字的信息……). UPDATE 我在受信任的Intranet下,但网络层次结构未知. 我试图找到哪些应用程序使用我的表(几个应用程序服务器,我不知道所有这些).他们中的一些过度使用连接,需要修复.但首先应该确定它们…… 解决方法请记住,Oracle会话不需要知道,当然也不需要信任您来自的客户端名称/ IP地址;它位于网络传输层之上,并不关心您是通过TCP / IP还是其他方式连接. (我甚至不确定监听器是否必须传递信息,或者它是否有效地传递了现成的套接字).正如您所见,机器正是客户端声明的内容,例如v $session视图中的程序和其他字段;它可能与DNS或您的服务器的/ etc / hosts可以解决的任何内容没有任何相似之处,特别是如果客户端是Windows框.您可以做的是,在Unix / Linux级别(因为您引用/ etc / hosts,我假设您不在Windows上),查找端口并查看显示的地址;例如v $session显示我的端口为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脚本来查询v $session中的端口号可能更容易,并以此方式进行查找. (编辑:广西网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |