[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. vue安装及axios、stylus、iview的安装流程整理

    现在做的项目中主要用到以下几个安装包,所以整理下流程: 使用命令行工具npm新创建一个vue项目 vue中axios的安装和使用 在vue项目中stylus的安装及使用 如何在vue中全局引入styl ...

  2. python(leetcode)-136只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  3. 【Object类、常用API】

    Object类 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类 ...

  4. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  5. Linux学习笔记之十二————vim编辑器的分屏操作

    一.分屏操作: sp: 上下分屏,后可跟文件名 vsp: 左右分屏,后可跟文件名 Ctr+w+w: 在多个窗口切换 二.启动分屏: 1.使用大写O参数进行垂直分屏 $ vim -On file1 fi ...

  6. Linux学习笔记之二————Linux系统的文件和目录

    一.Windows和Linux文件系统区别 1.在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示:  ...

  7. (剑指Offer)面试题45:圆圈中最后剩下的数字

    题目: 0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字. 思路: 1.环形链表模拟圆圈 创建一个n个节点的环形链表,然后每次在 ...

  8. 深入理解v-model

    原文链接:http://www.geeee.top/2019/04/03/vue-v-model/ 转载请注明出处 v-model v-model 是vue的一个语法糖,用于在表单控件或者在组件上创建 ...

  9. 本地k8s环境minikube搭建过程

    首先要安装docker这个环境是需要自己安装的.相关步骤如下: 1 2 3 4 5 6 7 8 9 10 11 yum install -y yum-utils device-mapper-persi ...

  10. Maven教程3(依赖管理)

    Maven教程2(Eclipse配置及maven项目) Maven项目,依赖,构建配置,以及构件:所有这些都是要建模和表述的对象.这些对 象通过一个名为项目对象模型(Project Object Mo ...