ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用tcpdump解决应用不能执行问题

使用tcpdump解决应用不能执行问题

原创 Linux操作系统 作者:浪漫双鱼 时间:2011-06-06 00:43:42 0 删除 编辑

今天有个应用需要上线,临时维护人员发现这两天加班准备用的生产数据突然跑不通流程了,喊应用人员分析应用、分析数据,结果没有任何结果。由于此应用系统有封装的包,所以应用那边没查出任何情况,连个报错都没打出来。

登上数据库服务器检查,发现流程处于等待时数据库无任何报错、无任何锁及等待。

sql_trace跟踪进程,也没发现任何问题。怀疑是根本就没有到sql这一步,于是采用tcpdump跟踪网络数据,看看到底进程做了什么操作。

[DB1] / # tcpdump -fRSttttX -s0 net 136.5.71.18 and tcp port 1521

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on en0, link-type 1, capture size 65535 bytes

…….

0x0020   5018 ffff e36e 0000 0065 0000 0600 0000        P.

0x0030   0000 0602 0101 0001 0a00 0000 0702 c102       

0x0040   0801 0603 ba4e c000 0102 0000 0000 0000       

0x0050   0401 3301 0102 057b 0000 0102 0003 0001        .

0x0060   2000 0000 0000 0000 0000 0000 0001 0100       

0x0070   0000 0019 4f52 412d 3031 3430 333a 206e        ....ORA-01403:.n

0x0080   6f20 6461 7461 2066 6f75 6e64 0a               o.data.found.

此处的ORA-01403报错是oracle的一个透明反馈,每次网络会话握手都会出现这个提示,我们操作数据库时已经被过滤了,所以平时是看不到的

……

2011-06-05 17:17:56.057448 IP CP_DB1_Per.ncube-lm > app1.44581: P 2291867068:2291867176(108) ack 648803202 win 65535

0x0000   4500 0094 cfc7 4000 3c06 ce31 8805 4826       

0x0010   8805 483a 05f1 ae25 889b 1dbc 26ab f382    ..

0020   5018 ffff 8ea8 0000 006c 0000 0600 0000        .

0x0030   0000 0402 049c 0001 0100 0001 0b00 0200        ................

0x0040   0000 0000 04ff ffff ff00 0000 0000 0000        ..........

0x0050   0000 0000 0000 3d4f 5241 2d30 3030 3031        ......=ORA-00001

0x0060   3a20 756e 6971 7565 2063 6f6e 7374 7261        :.unique.constra

0x0070   696e 7420 2843 504d 4953 2e50 4b5f 5441        int.(CP.PK_TA

0x0080   534b 5f53 4552 4941 4c29 2076 696f 6c61        SK_SERIAL).viola

0x0090   7465 640a                                      ted.

突然这个ORA-00001报错跳入眼帘,主键重复?!没想到一出手就有收获,呵呵,我笑……

   看来程序不能跑通是主键重复造成的,但我还是对程序不能打出报错很是郁闷,为什么要屏蔽错误,而且连个后门都没有,还得我只有动用大杀器,这都是后话,不说了。有了思路,马上行动,查询该主键现在的最大值,

select max(TASK_SERIAL_ID) from cpmis.TASK_SERIAL;

MAX(TASK_SERIAL_ID)

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

20050113

再查询相关序列的当前值

select seq.nextval from dual;

   NEXTVAL
----------
        1000021

可以看到,明显序列值小于表里面的最大值,这就是造成主键唯一性出问题的原因。知道问题出在哪里就可以处理了,直接把序列值的当前值调整到3000000,重新运行该程序,仍然报错,继续跟踪,发现ora-0001错误仍然存在。仔细想下,会不会是还有其它序列也往这个表里写,问下应用开发人员,确实是这样,郁闷,而且不知道具体会用到哪些序列了,没办法,只有来强的了,把全部的序列的当前值都改为3000000以上。由于此数据库里一共有400多个序列,所以采用如下方式处理,并批量生产sql,单条更改示例如下,

SQL> select seq.nextval from dual;
   NEXTVAL
----------
        100
SQL> alter sequence seq increment by 3000000;
序列已更改。
SQL> select seq.nextval from dual;
   NEXTVAL
----------
       3000101

更改之后,程序流程终于跑通了。

嘴角微翘,提上电脑包,消失在门外,不带走一个故障……

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11088128/viewspace-697211/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-10

  • 博文量
    87
  • 访问量
    231809