使用tcpdump解決應用不能執行問題

浪漫雙魚發表於2011-06-06

今天有個應用需要上線,臨時維護人員發現這兩天加班準備用的生產資料突然跑不通流程了,喊應用人員分析應用、分析資料,結果沒有任何結果。由於此應用系統有封裝的包,所以應用那邊沒查出任何情況,連個報錯都沒打出來。

登上資料庫伺服器檢查,發現流程處於等待時資料庫無任何報錯、無任何鎖及等待。

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章