【client_ip】通过v$session查询客户端的IP信息(二)

2014-11-24 16:45:34 · 作者: · 浏览: 1

SQL> select sid,client_info fromv$session where sid=138;

SID CLIENT_INFO

--------------------------------------------------------------------------

138 192.168.10.1

我的远程客户端的IP地址就是192.168.10.1。

3. utl_inaddr存储过程

在网上查看信息时有人提到utl_inaddr包中的两个存储过程可以分别根据主机名查询到IP,或根据Ip查询到主机名。

SQL>desc utl_inaddr;

FUNCTION GET_HOST_ADDRESS RETURNS VARCHAR2

Argument Name Type In/Out Default

---------------------- --------------- ------ --------

HOST VARCHAR2 IN DEFAULT

FUNCTION GET_HOST_NAME RETURNS VARCHAR2

Argument Name Type In/Out Default

----------------------- ---------------- ------ --------

IP VARCHAR2 IN DEFAULT

SQL>select utl_inaddr.get_host_address('ballontt01') from dual;

UTL_INADDR.GET_HOST_ADDRESS('BALLONTT01')

--------------------------------------------------------------------------------

192.168.1.11

我们可以看到主机名为ballontt01机器的IP地址为:192.168.1.11

甚至如果服务器可以联网,我们可以查询互联网上主机名对应的IP

SQL>select utl_inaddr.get_host_address('www.baidu.com') from dual;

UTL_INADDR.GET_HOST_ADDRESS('WWW.BAIDU.COM')

--------------------------------------------------------------------------------

220.181.111.148

其工作原理:执行该过程时,首先获取域名解析服务器(resolv.conf),在根据host.conf文件确定解析顺序,因为缺省是hosts文件优先解析,这个时候会又继续读取/etc/hosts文件。如果Hosts文件存在解析关系,则返回信息;如果不存在,则继续询问DNS服务器获得解析地址,如果不能解析,则会报错。

SQL> selectutl_inaddr.get_host_address('ballontt001') from dual;

selectutl_inaddr.get_host_address('ballontt001') from dual

*

ERROR at line 1:

ORA-29257: host ballontt001 unknown

ORA-06512: at"SYS.UTL_INADDR", line 19

ORA-06512: at"SYS.UTL_INADDR", line 40

ORA-06512: at line 1

如果在/etc/hosts加入ballontt001对应的IP后再次查询:

100.100.100.100 ballontt001

SQL> selectutl_inaddr.get_host_address('ballontt001') from dual;

UTL_INADDR.GET_HOST_ADDRESS('BALLONTT001')

--------------------------------------------------------------------------------

100.100.100.100

所以有些生产环境中,试图使用utl_inaddr包结合v$session视图中的machine字段(会话的主机名)来查询会话的IP时,因为hosts文件和DNS服务器中没有machine字段的信息而无法解析,进而导致报错,无法得到我们想要的结果。

综上所述,做为一名DBA,如果要想获得会话的IP,我们能做的就是方法2中的建立一个触发器。

ballontt
2014/02/25

---The End--- 微博:weibo.com/ballontt 如需转载,请标明出处和链接,谢谢!