前言
发现一套MogDB 5.0.5版本的测试数据库再使用pg_terminate_backend后,仍无法杀掉数据库会话。
处理流程
1、首先检查用户是否具备sysadmin权限,指导用户使用omm用户进行pg_terminate_backend之后,发现仍无法杀掉会话
select pg_terminate_backend(<线程pid>);
select * from pg_stat_activity where pid = <线程pid>;


2、检查锁和等待事件,发现没有锁阻塞,等待事件是hash jion,属于正常等待事件。
SELECT * FROM pg_locks WHERE pid = <线程pid>;
select tid,sessionid,wait_status,wait_event,locktag,lockmode,block_sessionid from pg_thread_wait_status where sessionid = <线程pid>;


3、跟用户简单沟通后,发现用户把jdk也已经关闭了,理论上在业务侧关闭后,事务也会随之消失,本次故障现象非常的奇怪。

4、通过数据字典查询轻量级PID,查看线程堆栈
select lwpid from DBE_PERF.get_global_os_threads() where pid = <线程pid>;
ps -ef|grep mogdb
ps -T -p <MogDB pid>|grep <线程lwpid>
gstack <线程lwpid>



5、发现线程卡在 pread 系统调用时,在使用pthread_kill终止线程会被系统阻止该信号的处理,只能执行使用kill命令尝试强制终止线程。

6、多次调用kill命令终止线程处理,问题现象消失。
kill -s 15 <现成lwpid>
总结及拾遗
PG家族数据库在使用pg_terminate_backend和pg_terminate_session等函数时,只是向系统发送一个sigthreadkill信号,如果线程本身正在处理一个高级别的操作,sigthreadkill信号会被阻碍,不会立刻生效。这就是为什么有时函数执行返回t,会话仍存在的原因。遇到类似问题,可以考虑使用系统的kill -9/kill -15等更高级别的命令杀掉进程(线程)。
最后修改时间:2024-09-11 13:22:25
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




