【从本人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 进程意外终止。

猜你喜欢

转载自blog.csdn.net/wzh474420999/article/details/79620021
今日推荐