环境
系统平台:银河麒麟 (鲲鹏)
版本:4.5.6
症状
1、通过查询锁语句,发现两个创建索引会话(session1、session2)阻塞了后续所有SQL语句的执行。

2、查看创建索引进程视图,一条信息也没有

3、查看主表信息,只有928939进程获取到共享锁,创建索引需要访问排它锁,还未获取。

问题原因
1、在分区表主表创建索引时,数据库内核会自动递归创建所有子分区索引,这是内核原生逻辑。
2、为了提升索引创建效率,使用hg_parallizator插件,该插件会拆分任务在各个子分区并行创建索引,导致:
01)内核递归的子分区索引创建
02)插件下发的子分区索引创建
两个任务同时对同一个子分区申请排他锁,产生锁竞争。
由于数据库内核存在底层缺陷,竞争后无法正常唤醒等待会话,最终引发索引创建永久阻塞。
解决方案
1、如果不是分区表且没有大量索引需要创建,停用hg_parallizator插件。
去掉shared_preload_libraries参数中的hg_parallizator,数据库重启生效。
2、升级新版hg_parallizator插件
主表创建索引语句增加ONLY关键字,限制其仅创建本级索引,不递归创建子索引,避免锁竞争。
1734

被折叠的 条评论
为什么被折叠?



