gpt4 book ai didi

oracle - 获取已建立的 Oracle 11 连接的 IP 地址

转载 作者:行者123 更新时间:2023-12-02 08:21:25 27 4
gpt4 key购买 nike

在开发过程中,我发现数据库有大量事件连接:

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/hostname中定义strong> 并且不适用于我们 Intranet 中的 DNS 服务器...

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

更新

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

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

最佳答案

请记住,Oracle session 不需要知道,当然也不需要信任您来自的客户端名称/IP 地址;它位于网络传输层之上,并不真正关心您是通过 TCP/IP 还是其他方式进行连接。 (我什至不确定监听器是否必须传递信息,或者它是否有效地传递现成的套接字)。正如您所看到的,machine 正是客户端声明的内容,如 programv$session View 中的其他字段;它可能与 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 号并以这种方式进行查找可能更容易。

关于oracle - 获取已建立的 Oracle 11 连接的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15069145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com