SYS_CONTEXT函数返回IP地址的一些误解

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SYS_CONTEXT函数返回IP地址的一些误解

上次分享中曾使用了SYS_CONTEXT函数获取ip地址,但返回值为空,当时认为其是返回ipv6的地址,所以为空,但其实这是错误的结论。虽然是一个小小的知识点,但从中可以看出Oracle对于这种内置函数的考虑非常周到,我们先看如下是返回空的ip地址的一个示例, SYS_CONTEXT函数返回IP地址的一些误解

我们首先看看SYS_CONTEXT函数的定义,
SYS_CONTEXT函数返回IP地址的一些误解

这个函数有两个入参,第一个值是命名空间,取值可以是“USERENV”或“SYS_SESSION_ROLES”,第二个值是一些列属性,例如我们使用的IP_ADDRESS,
SYS_CONTEXT函数返回IP地址的一些误解

含义是,

IP address of the machine from which the client is connected. If the  client and server are on the same machine and the connection uses IPv6 addressing, then ::1 is returned.

返回的是客户端连接的机器IP,如果客户端和服务器是同机,则连接会使用IPv6地址,::1会返回。

MOS这篇文章说明了这个问题,

SYS_CONTEXT(‘USERENV’, ‘IP_ADDRESS’) Function Returns A Null Value (文档ID 470504.1)

主要意思就是如果客户端没用使用TCP协议(也就是使用tnsnames.ora定义的连接串)连接,不会返回IP地址,

IP address is not available if client is not connecting through TCP (@SID).

可以看出使用了@SID,则返回了本机IP地址,
SYS_CONTEXT函数返回IP地址的一些误解

和SYS_CONTEXT函数有联系的还有这两篇文章,

SYS_CONTEXT (‘USERENV’, ‘IP_ADDRESS’) Returns Hostname Rather Than Client IP (文档 ID 1267855.1)

若使用了11.2.0.x的监听器访问10.2.0.4,则返回的是主机名,不是IP地址。解决方案就是,

1) Use IP address and not hostname in the Oracle 11 listener address.  2) When using a hostname contain the listen protocol address by using (IP=FIRST), (IP=V4_ONLY) or (IP=V6_ONLY).  Working listener address examples:  (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)(IP=FIRST))  (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)(IP=V4_ONLY))  (ADDRESS = (PROTOCOL = TCP)(HOST = IP_address)(PORT = 1521))

另一篇文章是,

SYS_CONTEXT(‘USERENV’,’IP_ADDRESS’) Doesn’T Return Ipv4 Address When Ipv6 is Enabled (文档 ID 1175504.1)

使用11.1.0.7的监听器查询的时候,例如IPv4是10.16.120.165,则返回是”::ffff:10.16.120.165”,原因就是11.1版本不支持IPv6,无法做转换,解决方案是,

1) Disable IPV6 at OS level 2) Upgrade the database from 11.1.0.7.0 to 11.2.0.1.0

总结:
Oracle中几乎所有细节,其实都有可能蕴含着一些特殊含义或用法,足以见其设计的精妙,唯有持续积累,才能收获更多。

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

SYS_CONTEXT函数返回IP地址的一些误解
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SYS_CONTEXT函数返回IP地址的一些误解


 上一篇
一种批量删除数据的方法 一种批量删除数据的方法
这两天碰见一个比较紧急的生产问题,由于还在处理中,所以暂时不能给出整体描述,但其中涉及的一个问题就是删除一张大表中的过期历史数据,针对不同的类型的表可能有不同的解决方法,比如若是按照时间做的分区表,drop partition删除分区的
下一篇 
PLUSTRACE角色 PLUSTRACE角色
使用示例数据库用户HR登陆需要打印执行计划等信息的时候,提示了错误,提示很清楚了,PLUSTRACE角色未赋给HR。 查询HR所有的角色,确实缺少PLUSTRACE角色, 通过oerr工具,可以进一步查看这个错误, AUTOTRACE Op