DB2 的锁机制一向比较“有性格”,尤其是你在做联机备份的时候还想顺手建个索引,就容易踩坑。之前我就遇到这么个奇怪的锁等待问题,搞了半天才发现,原来是 DB2 内部的联机备份锁在作怪。
场景是这样的,数据库在跑联机备份,我发起了一个建索引的操作,结果进程就一直卡着,也不报错。你以为是LOCKTIMEOUT
没设好?我当时也这么想,结果设了也没用,因为它根本不受影响——系统直接无视。
后来我研究了一圈才发现,只要表空间里的表够多、备份一跑得久,DB2 就会锁得“死”。而这个锁,不是你常规能解的那种,需要对备份和建索引的时间做点规划。比如,想办法让索引操作在备份前搞定,或者备份尽量放在业务低峰时段跑,效果还挺。
我在文档里还写了个复现步骤,照着搞一遍就能看到锁是怎么卡住的。测试时记得设置归档日志、配置LOCKTIMEOUT
、灌入大量数据,跑备份和索引操作。直观,起来也方便。
对了,如果你用的是db2pd或者db2top这类工具,建议配合着一起用。监控锁状态和事务信息会清楚多。还有,db2trace
也能搞出不少有用的日志,锁卡在哪儿一看就知道。
,DB2 这事吧,说复杂不复杂,说简单也挺绕。如果你也在搞数据库维护,这个案例你得看看,说不定哪天就碰上了。嗯,如果你喜欢更深入的技术,也可以顺手看看这篇锁等待详解,讲得还蛮细的。