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中的建立一个触发器。