OpenGauss中创建表耗时过长且失败,求助解决锁等待超时问题
问题分析
执行以下创建表语句时耗时极长且最终失败:
create table ADVISOR ( STU_ID varchar(5) not null, ID varchar(5), primary key (STU_ID) );
报错信息:
错误:锁等待超时:节点dn_6001上的线程140197302351616等待事务7766上的ShareLock已达1200000.600毫秒
详情:被持有锁的线程140197328570112阻塞,该线程执行语句<select * from advisor;>,持有锁模式为ExclusiveLock。
studentdb=>
核心原因是已有未结束的事务对不存在的ADVISOR表持有排他锁(ExclusiveLock),导致建表请求所需的共享锁(ShareLock)无法获取,最终触发超时。这类情况多因误操作查询不存在的表后,事务未及时提交或回滚所致。
解决方案
- 终止阻塞事务
- 登录数据库,执行语句定位目标事务:
SELECT pid, datname, usename, query, state FROM pg_stat_activity WHERE datname = 'studentdb'; - 找到执行
select * from advisor;的进程ID(pid),执行终止命令:SELECT pg_terminate_backend('目标进程ID');
- 登录数据库,执行语句定位目标事务:
- 临时调整锁等待超时(应急方案)
若无法立即终止事务,可临时调大锁等待超时参数,完成建表后恢复默认值:SET lockwait_timeout = '300s'; -- 根据实际需求调整时长 create table ADVISOR(STU_ID varchar(5) not null, ID varchar(5), primary key (STU_ID)); SET lockwait_timeout = '120s'; -- 恢复默认超时时间 - 预防措施
- 所有事务执行后必须及时提交(
COMMIT)或回滚(ROLLBACK),避免长时间持有锁资源 - 避免在未提交的事务中查询不存在的表,这类操作可能产生意外锁持有
- 所有事务执行后必须及时提交(
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

