Db2数据库错误:
突然收到监控平台报警,db2 50000端口无法访问。进入对应用户查看,查询db2线程已被杀死,尝试再次启动db2,报如下错误。
SQL1072C The database manager resources are in an inconsistent state. DB2 may have been incorrectly terminated, or another application may be using system resources in a way which conflicts with DB2's use of system resources. System resource cleanup may be required
通过db2diag分析,线程被某个应用杀死。这个时候想了下就只有linux kernel有这个权限了。
打开messages日志查看到如下:
发现session被内核关闭了!
查看红色部分是需要重点关注的:
根据上述日志排除:
libdb2e.so.1 此程序映射的内存地址为7f65bldfc000,
segfault at和error 4这两条信息可以得出是内存读出错,6的意义如下,可以对照参考
需要将错误代码转换成二进制
bit2:值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
用户无法直接操作内存,由kernel作为介质来进行操。根据上述信息
db2inst1用户在写操作时发生了内存访问越界,导致linux关闭了此seesion。
这里关于底层问题!!!!!,本人技术有限…所有无法在进行分析。
若有兴趣可访问此URL
https://stackoverflow.com/questions/2549214/interpreting-segfault-messages
知道问题为什么会发生后,根据对应操作来进行恢复数据库:
也就是db2 发现通信进程无法通信,我们只需要更新一下这个
在数据库用户上运行
$db2_kill
$ipclean
补充说明:
ipclean(如果实例或停止数据库命令都挂起的话,最后采取的方法,清除所有实例资源)
对于要更新的实例,确保已清除了所有 DB2 进程间通信(IPC)。作为实例拥有者,在每个物理节点上运行以下命令:ipclean