【從本人QQ空間遷移】DB2 SQL1042問題解決(二)

     背景描述:接上回,自定義函數報錯SQLC-1042 sqlstate:58004 .此情況,在用戶多時出現,另外重啓數據庫就又可以運行函數。
     由於此類問題發生已有3次之多,所以,可以直接肯定是數據庫問題。
    雖然昨個增大查詢堆的參數值,但是仍然未能解決。
     上DB2日誌內容;
      2014-07-18-10.23.13.869864+480 I8838102E311        LEVEL: Warning
     PID     : 30934                TID  : 139650904241952PROC : db2fmp (
INSTANCE: db2inst1             NODE : 000
FUNCTION: DB2 UDB, routine_infrastructure, sqlerMasterThreadListener, probe:300
MESSAGE :
Java heap is nearly full; no thread created
2014-07-18-10.23.13.871438+480 I8838414E570        LEVEL: Warning
PID     : 29888                TID  : 140615278913280PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000          DB   : DSP
APPHDL  : 0-26                 APPID: 66.185.64.125.16788.14071705004
AUTHID  : DSP    
EDUID   : 44                   EDUNAME: db2agent (DSP) 0
FUNCTION: DB2 UDB, routine_infrastructure, sqlerMasterThreadReq, probe:89
MESSAGE :
FMP reported it could not create a new thread
DATA #1 : Hexdump, 4 bytes
0x0000000200E2F480 : D678 0000                                  .x..
2014-07-18-10.23.13.909358+480 I8838985E445        LEVEL: Severe
PID     : 29888                TID  : 140615278913280PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000          DB   : DSP
APPHDL  : 0-26                 APPID: 66.185.64.125.16788.14071705004
AUTHID  : DSP    
EDUID   : 44                   EDUNAME: db2agent (DSP) 0
FUNCTION: DB2 UDB, routine_infrastructure, sqlerGetFmpThread, probe:20
RETCODE : ZRC=0xFFFFFBEE=-1042
2014-07-18-10.23.20.483769+480 I8839431E366        LEVEL: Warning
PID     : 29888                TID  : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000
EDUID   : 20                   EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgArchiveLogFile, probe:3108
MESSAGE : Started archive for log file S0000000.LOG.
2014-07-18-10.23.21.643368+480 E8839798E557        LEVEL: Error
PID     : 29888                TID  : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000
EDUID   : 20                   EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgUserexitLogAdminMsg, probe:1140
MESSAGE : ADM1832E  DB2 was unable to find the user exit program when archiving
          log file "S0000000.LOG" from
          "/home/db2/dsp/db2inst1/NODE0000/SQL00001/SQLOGDIR/" for database
          "DSP".  The error code was "24".
2014-07-18-10.23.21.658213+480 E8840356E459        LEVEL: Warning
PID     : 29888                TID  : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000
EDUID   : 20                   EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgArchiveLogFile, probe:3150
MESSAGE : ADM1848W  Failed to archive log file "S0000000.LOG" to "USEREXIT"
          from "/home/db2/dsp/db2inst1/NODE0000/SQL00001/SQLOGDIR/".
2014-07-18-10.23.21.658913+480 E8840816E460        LEVEL: Error
PID     : 29888                TID  : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000
EDUID   : 20                   EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgArchiveLogFile, probe:3155
DATA #1 : <preformatted>
Failed to archive log file S0000000.LOG to USEREXIT from /home/db2/dsp/db2inst1/NODE0000/SQL00001/SQLOGDIR/ return code 24.
2014-07-18-10.23.21.659004+480 I8841277E431        LEVEL: Warning
PID     : 29888                TID  : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000
EDUID   : 20                   EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgRetryFailedArchive, probe:4780
MESSAGE : Still unable to archive log file 0 due to rc 24 for LOGARCHMETH1
          using method 4 and target .
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 從日誌文件,可以看到Java heap is nearly full; no thread created。java堆棧已滿,不能創建線程。
 最初我打算直接增大java_heap_sz這一參數大小的。由4096增大至8192。
 並將該日誌報錯發在DB2的DBA羣裏。
羣內討論激烈,我也覺得單純修改java_heap_sz沒那麼簡單,應該還有其他原因制約。
 一位DB2的DBA羣裏的大神,給予瞭解答。有些我能理解,有些我就不太明白。大致步驟如下:
 db2level
 db2set -all
 db2 get dbm cfg
 db2set -lr|grep DB2_FMP_COMM_HEAPSZ 
 db2pd -fmp
 這裏詢問我物理內存還剩下多少,我用了free -m,查了下。
 如果是20M的話,那你的系統就只夠10個db2fmp (process+thread)
 那如果你要100個併發跑這個function的話,得好用200M內存
這裏的100是總的db2fmp的進程+線程 

 (最後要求我設置下)
 db2set DB2_FMP_COMM_HEAPSZ=64000
 重啓完跑下這個命令:db2pd -dbptnmem
--------------------------------------------------------------------------------------------------------------------------------------------------
 DB2_FMP_COMM_HEAPSZ
這個是db2set 註冊表參數,將這個值設置爲 0 就表示不創建池,因此不能調用防護例程。
每個防護例程所使用的空間是 ASLHEAPSZ 配置參數值的兩倍。
可以同時運行進程的計算公式: 

Maximum Number of db2fmps = DB2_FMP_COMM_HEAPSZ / (2*ASLHEAPSZ) 
文中的db2pd -fmp命令我沒用過。

ASLHEAPSZ: 這是一個數據庫管理器配置(DBM CFG)參數。這個參數確定緩衝區的大小,用於在例程和發出調用的應用程序之間傳遞參數。存儲過程中的參數數量和參數大小明確地影響這個配置參數。系統上允許同時存在的 db2fmp 進程的最大數量也受這個參數的影
但是java查詢堆最大值受QUERY_HEAP_SZ影響。
QUERY_HEAP_SZ:
 這是一個數據庫管理器配置(DBM CFG)參數。 這個參數指定可以分配給查詢堆的最大內存量。如果這個參數設置得過低,那麼執行復雜 SQL 的存儲過程會導致 db2fmp 進程意外終止。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章