Postgre SQL pgsql解决表死锁解锁

问题描述

对表进行范围更新,导致表锁死,业务系统瘫痪

解决办法

 --查询是否锁表了
select oid from pg_class where relname='可能锁表了的表'
--pid 是进程
select pid from pg_locks where relation='上面查出的oid'
--如果查询到了结果,表示该表被锁 则需要释放锁定
select pg_cancel_backend(上面查到的pid)

--批量杀死pid进程,把执行结果复制下来,一起执行即可
select 'select pg_cancel_backend( '''|| 填pid ||''');' pid from pg_locks where relation='填oid'

大招

如果以上方法进程杀不掉,用以下命令可解决


select pg_terminate_backend([pid]);

函数区别

pg_cancel_backend()

只能关闭当前用户下的后台进程,向后台发送SIGINT信号,用于关闭事务,此时session还在,并且事务回滚.

pg_terminate_backend()

需要superuser权限,可以关闭所有的后台进程,向后台发送SIGTERM信号,用于关闭事务,此时session也会被关闭,并且事务回滚

注意

pg_terminate_backend()会把session也关闭,此时sessionId会失效,可能会导致系统账号退出登录,需要清除掉浏览器的缓存cookie

参考

https://www.cnblogs.com/yulinlewis/p/11863750.html

你可能感兴趣的:(sql,数据库)