数据库crash后无法启动,启动时报如下错误:SQL1072C 数据库管理器资源处于不一致状态。数据库管理器可能已被不正确地终止,或者另一个应用程序使用系统资源的方式与数据库管理器使用系统资源的方式发生冲突。
具体解决步骤如下所示:
一、通过检查db2diag.log日志发现如下错误信息:
2015-01-15-21.16.45.815270+480 I192752690A2038 LEVEL: Error (OS)
PID : 11076548 TID : 258 PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 258 EDUNAME: db2sysc 0
FUNCTION: DB2 Common, OSSe, ossErrorMemoryAnalysis, probe:100
CALLED : OS, -, fork
OSERR : ENOMEM (12) "Not enough space"
DATA #1 : String, 72 bytes
A total of 5 analysis will be performed :
- ulimit info
- Memory info
DATA #2 : String, 381 bytes
Current process limits (unit in bytes except for nofiles) :
mem (S/H) = unlimited / unlimited
core (S/H) = unlimited / unlimited
cpu (S/H) = unlimited / unlimited
data (S/H) = unlimited / unlimited
fsize (S/H) = unlimited / unlimited
nofiles (S/H) = unlimited / unlimited
stack (S/H) = 4294967296 / 4294967296
rss (S/H) = unlimited / unlimited
DATA #3 : String, 41 bytes
current sbrk(0) value: 0x0000001f0e881480
DATA #4 : String, 118 bytes
System RAM information (in megabytes) :
Total = 39936
Free = 69
Available = -1
Addressable = -1
DATA #5 : String, 69 bytes
Swap space information (in megabytes) :
Total = 16384
Free = 480
DATA #6 : String, 115 bytes
Virtual Memory Information (in megabytes) :
Total = 56320
Reserved = -1
Available = -1
Free = 549
CALLSTCK: (Static functions may not be resolved correctly, as they are resolved to the nearest symbol)
[0] 0x0900000007749F2C pdOSSeLoggingCallback + 0x34
[1] 0x09000000014B4CC4 oss_log__FP9OSSLogFacUiN32UlN26iPPc + 0x1C4
[2] 0x09000000014B51A0 ossLogSysRC + 0xA0
[3] 0x09000000014D4924 ossErrorMemoryAnalysis__FCPC21OSSErrorAnalysisParam + 0x744
[4] 0x09000000014D5DD4 ossErrorAnalysis@AF12_1 + 0x34
[5] 0x0900000009BD1D30 sqloSystemErrorHandler + 0x3E0
[6] 0x0900000009BDE5A0 sqloSystemErrorHandler@glue7E8 + 0x154
[7] 0x090000000732D6A8 @83@sqloexecs__FPCcN21iPiT4CP19SQLO_NPIPE_HANDLE_TT7 + 0x280
[8] 0x0900000007EC5064 sqloexec2 + 0x2C
[9] 0x0900000007ED1B88 sqloInitializeVendorProcess + 0x3BC
2015-01-15-21.16.45.831607+480 I192754729A567 LEVEL: Error
PID : 11076548 TID : 258 PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 258 EDUNAME: db2sysc 0
FUNCTION: DB2 UDB, oper system services, sqloInitializeVendorProcess, probe:200
MESSAGE : ZRC=0x870F00FA=-2029059846=SQLO_MEMORY_LIMIT
"no memory to create process"
DATA #1 : String, 30 bytes
Error creating vendor process.
DATA #2 : String, 33 bytes
/home/db2inst1/sqllib/bin/db2vend
DATA #3 : String, 23 bytes
PD Vendor Process - 258
我们通过以上日志分析猜测可能的原因是由于操作系统内存资源耗尽导致系统强制杀死所有非关键进程导致数据库崩溃。
二、我们通过AIX通过系统日志进一步验证
1、使用errpt -dS 显示最近错误列表
2、使用errpt -aj 查看时间点最近的错误日志信息
LABEL: PGSP_KILL
IDENTIFIER: C5C09FFA
Date/Time: Thu Jan 15 21:16:32 GMT+08:00 2015
Sequence Number: 2752
Machine Id: 00C3F6744C00
Node Id: cbusdbst
Class: S
Type: PERM
WPAR: Global
Resource Name: SYSVMM
Description
SOFTWARE PROGRAM ABNORMALLY TERMINATED
Probable Causes
SYSTEM RUNNING OUT OF PAGING SPACE
Failure Causes
INSUFFICIENT PAGING SPACE DEFINED FOR THE SYSTEM
PROGRAM USING EXCESSIVE AMOUNT OF PAGING SPACE
Recommended Actions
DEFINE ADDITIONAL PAGING SPACE
REDUCE PAGING SPACE REQUIREMENTS OF PROGRAM(S)
Detail Data
PROGRAM
db2fmp
USER‘S PROCESS ID:
21889096
PROGRAM‘S PAGING SPACE USE IN 1KB BLOCKS
0
通过以上红色的信息,我们可以确认当时的确是因为AIX操作系统内存资源耗尽后,SYSVMM主动杀死了db2sys进程释放内存资源。
三、如何恢复数据库到一致性状态
1、杀死所有db2实例下的相关进程:db2_kill
2、清除内存中的相关进程的缓存信息:ipclean
3、启动db2:db2start 启动成功
四、那么为何会产生此类问题
我们通过检查db2数据库参数的设置发现如下问题:
db2inst1:/home/db2inst1>db2 get dbm cfg|grep -i mem
Size of instance shared memory (4KB) (INSTANCE_MEMORY) = AUTOMATIC(9066483)
db2的实例级内存请求设置为了automatic从而导致当db2在遭遇过载服务时,过渡的向系统申请资源从而导致操作系统内存资源耗尽问题的发生,最终导致了数据库实例的crash。
五、如何避免此类问题的再次发生
为避免此类问题的发生我们可以调整实例内存参数为固定值即可
db2 update dbm cfg using INSTANCE_MEMORY 9066483
原文:http://blog.chinaunix.net/uid-25723371-id-4765653.html