[20180124]奇怪的SQL*Net message from dblink.txt

--//生产系统出现大量的SQL*Net message from dblink事件,自己分析看看.

1.环境:
--//这个环境是服务器在分院,有时候要通过dblink访问总院的数据库.

xxxx> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

xxxx> @ ev_name.sql "SQL*Net message from dblink"
EVENT#   EVENT_ID NAME                        PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS
------ ---------- --------------------------- ---------- ---------- ---------- ------------- ----------- ----------
   356 4093028837 SQL*Net message from dblink driver id  #bytes                   2000153315           7 Network

--//P2参数表示传输的字节数量.我发现一个奇特现象:

xxxx> SELECT *  FROM V$ACTIVE_SESSION_HISTORY WHERE event = 'SQL*Net message from dblink' AND p2 > 1;
no rows selected

xxxx> SELECT count(*)  FROM V$ACTIVE_SESSION_HISTORY WHERE event = 'SQL*Net message from dblink' AND p2 = 1;
  COUNT(*)
----------
    181068

--//出现问题的都是1个字节的情况,按照道理这样的传输不会出现的SQL*Net message from dblink事件,虽然分院与总院租用的电信的线路,
--//至少10M的带宽,本想找网络管理员要网络出口的流量图,估计没做监控,失望.不过传输量这么小,网络应该问题不大.

--//我从总院内网的一台机器ping分院服务器.使用
# ping -s 9000 分院服务器
...
9 packets transmitted, 9 received, 0% packet loss, time 8007ms
rtt min/avg/max/mdev = 1.034/1.255/2.776/0.539 ms

# ping -s 9000 总院服务器
10 packets transmitted, 10 received, 0% packet loss, time 9000ms
rtt min/avg/max/mdev = 0.303/0.342/0.402/0.039 ms

--//大约1ms往返内网网之间,应该问题不大.而我执行如下:

/* Formatted on 2018/1/24 9:24:37 (QP5 v5.269.14213.34769) */
  SELECT machine
        ,port
        ,session_id
        ,session_serial#
        ,MIN (sample_time) MIN
        ,MAX (sample_time) MAX
        ,MAX (sample_time) - MIN (sample_time) delta
    FROM V$ACTIVE_SESSION_HISTORY
   WHERE event = 'SQL*Net message from dblink'
GROUP BY machine
        ,port
        ,session_id
        ,session_serial#
ORDER BY 5 DESC;

--//我发现一个独特的规律,delta的间隔大多数都是+00 00:15:24.369000上下相差1秒.15*60+25 = 925.另外我使用如下查询:

SELECT sql_id,count(*)  FROM V$ACTIVE_SESSION_HISTORY WHERE event = 'SQL*Net message from dblink' group by sql_id order by 2 desc;

--//反查sql语句,居然发现靠前的几个存在dblink访问外.其中一些执行如下:
select sysdate from dual;

--//很明显dblink链路出了问题,才会出现这样的情况.

2.分析:
--//分析我已经在链接:
http://blog.itpub.net/267265/viewspace-2150434/
http://blog.itpub.net/267265/viewspace-2150431/

--//问题在于使用总院服务器设置了SQLNET.EXPIRE_TIME参数,,定时监测服务端与客户端连接情况.对于这里监测dblink的连接情况.
--//但是在总院与分院之间配置的是状态防火墙,不允许这样的包通过,这样总院服务器发起的测试连接都被阻塞.而且根据前面的测试
--//一旦发出测试包发现不通,dblink的连接就出现问题.这样用户的应用程序如果仅仅访问分院的服务器数据库不会存在问题.因为这条
--//链接是通的,但是一旦执行事务提交就会挂起(注使用dblink是会产生小量的redo的).这就是我们现在生产系统遇到的问题.

--//补充说明,使用dblink会产生事务的.许多开发并不知道,关于如何关闭数据库会话的dblink,参考链接
--//http://blog.itpub.net/267265/viewspace-2123710/
SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> @ &r/xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------

no rows selected

SCOTT@book> select sysdate from dual@loopback ;
SYSDATE
-------------------
2018-01-24 09:43:27

SCOTT@book> @ &r/xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------
10.21.21378

--//注xid.sql脚本:
select dbms_transaction.local_transaction_id()  XIDUSN_XIDSLOT_XIDSQN from dual ;

--//一种情况很特殊,如果在dg上以只读打开数据库,使用dblink是没有问题在11g下(10g会存在问题),但是如果sql语句涉及2个dblink链
--//接,这个问题可以参考我以前的链接:http://blog.itpub.net/267265/viewspace-2138879/

--//这个时间大约就是925秒,与我前面链接http://blog.itpub.net/267265/viewspace-2150434/,http://blog.itpub.net/267265/viewspace-2150431/
--//是一致的,补充1点,我前面的测试少算了最后1次测试时间120.补上基本一致了.

3.解决访问:
--//最佳方法就是取消状态防火墙设置.这是最佳方案.
--//或者增加SQLNET.EXPIRE_TIME参数设置,规避服务器发起的监测,不过这样就失去这个参数的意义.
--//在访问dblink后,即使select最好加一个提交.这样虽然dblink连接不会断开,至少一些应用不会出错.因为一些应用的提交顺带提交访问dblink产生的事务.
--//如果这时dblink出问题,用户的操作也会挂起,rollback掉.

--//最后再次佩服我们的使用者,居然这样的问题也能忍耐,要是不是一次下班路上别人给我提起,我才关注这个问题.
--//更加佩服我们的团队,这个问题存在这么长时间,开发反应,我们数据库团队把问题归到网络,就没有任何人静下来思考解决问题.失望....

4.我自己也重复测试:
xxxx> select sysdate from dual@xhlis;
SYSDATE
-------------------
2018-01-24 10:05:52

xxxx> host sleep 900

xxxx>
xxxx> select sysdate from dual ;
SYSDATE
-------------------
2018-01-24 10:23:39

--//本地可以访问,如果你执行dml的提交问题再现

xxxx> commit;
--//挂起...

[20180124]奇怪的SQL*Net message from dblink.txt的更多相关文章

  1. 网络上的等待事件 —— SQL*Net message from client/dblink

    SQL*Net message from client SQL> select event#,name,parameter1,parameter2,parameter3 from v$event ...

  2. SQL*Net message from client

    SQL*Net message from client The server process (foreground process) waits for a message from the cli ...

  3. SQL*Net message to client

    SQL*Net message to client The server (foreground process) is sending a message to the client. 这个wait ...

  4. ORACLE等待事件:SQL*Net message from client & SQL*Net message to client

    在ORACLE当中有两个很常见的等待事件"SQL*Net message from client"与"SQL*Net message to client",两者 ...

  5. 性能问题: SQL*Net message from client 等待时间太长

    今天我终于自己遇到了这个问题, PO form 打不开了, 看了下 trace 发现 SQL*Net message from client 等待时间太长. 但是这不可能是网络问题, 这个环境是在我电 ...

  6. [20170622]传输表空间与dblink.txt

    [20170622]传输表空间与dblink.txt --//测试看看使用dblink+传输表空间的情况.写的情况相对复杂一点,具体看测试: 1.环境:--//2个数据库版本一致.实际上在1台主机上. ...

  7. [20191125]oracel SQL parsing function qcplgte 2.txt

    [20191125]oracel SQL parsing function qcplgte 2.txt --//参考前面的测试:http://blog.itpub.net/267265/viewspa ...

  8. runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance

    情景: 使用MethodSwizzle 实现对数组.字典 等系统方法的安全校验.显然能达到预期效果,但实际发现当 键盘显示的情况下  home app 进入后台,再单击app  图标 切换回前台时 发 ...

  9. PCB SQL Server 代码创建DbLink

    代码如下: ) ) ) ) ) SET @serverName = 'DbLinkName' --db链接名 SET @ip = '120.79.36.65' --需连接服务器的IP SET @dbN ...

随机推荐

  1. Xamarin.Android Timer使用方法

    首先声明命名空间: using System.Threading; 然后创建Timer对象: Timer timer; 接着实例化timer并且给委托事件: TimerCallback timerDe ...

  2. 关于resin的illegal utf8 encoding at (190)解决方式

    最近在项目开发中,出现了编码异常,内容如下:- illegal utf8 encoding at (190)com.caucho.jsp.JspParseException: illegal utf8 ...

  3. ES6中的proxy

    1 概述 Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写. Proxy 这个词的原意是代理,用在这 ...

  4. spring载入外部配置文件的方法

    <bean class=“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer“> <prop ...

  5. 从零开始学 Web 之 jQuery(二)获取和操作元素的属性

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  6. Python 虚拟环境 | Mac/Linux下如何避坑安装配置Virtualenv

    1.为什么要使用虚拟环境 在Python中,不同的应用可能需要用到不同版本的第三方包,而这些第三方包被统一存放到目录site-packages中,不同版本的包容易相互覆盖,如安装Django 2.1时 ...

  7. linux centos7 root密码重置

    转:http://blog.chinaunix.net/uid-21209618-id-4738916.html 分类: LINUX 三年左右没接触linux技术工作,忘记的有很多.不知该怎么去运用. ...

  8. Golang GC原理

    一.内存泄漏 内存泄露,是从操作系统的角度上来阐述的,形象的比喻就是“操作系统可提供给所有进程的存储空间(虚拟内存空间)正在被某个进程榨干”,导致的原因就是程序在运行的时候,会不断地动态开辟的存储空间 ...

  9. #16 os&sys模块

    前言 在编写Python程序的时候,可能需要和操作系统进行交互,比如获取某个目录下的内容.更改运行目录.更改环境变量等操作.在Python中有两个模块将这些问题完美解决,一起看看哇! 一.os模块 o ...

  10. [Luogu 3401] 洛谷树

    Description 有一棵树,要求支持 查询两点间简单路径的所有子链的异或和的和 修改某条边的权值 Solution 这种树上异或问题首先应该想到对于每个点存下一个前缀异或和表示这个点到根节点路径 ...