• 售前

  • 售后

热门帖子
入门百科

postgresql表死锁题目标排查方式

[复制链接]
没有昵称513 显示全部楼层 发表于 2021-10-26 13:58:12 |阅读模式 打印 上一主题 下一主题
1.查询激活的实验中的sql,查察有哪些更新update的sql。
  1. select *
  2. from pg_stat_activity
  3. where state = 'active';
复制代码
2. 查询表中存在的锁
  1. select a.locktype, a.database, a.pid, a.mode, a.relation, b.relname
  2. from pg_locks a
  3. join pg_class b on a.relation = b.oid
  4. where lower(b.relname) = 'h5_game';
复制代码
3. 杀掉死锁历程
  1. select pg_terminate_backend(pid)
  2. from pg_stat_activity
  3. where state = 'active'
  4. and pid != pg_backend_pid()
  5. --and pid = 14172
  6. and pid in (select a.pid
  7. from pg_locks a
  8. join pg_class b on a.relation = b.oid
  9. where lower(b.relname) = 'news_content')
复制代码
锁模式
  1. /* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */
  2. #define NoLock                 0
  3. #define AccessShareLock         1        /* SELECT */
  4. #define RowShareLock          2        /* SELECT FOR UPDATE/FOR SHARE */
  5. #define RowExclusiveLock        3        /* INSERT, UPDATE, DELETE */
  6. #define ShareUpdateExclusiveLock 4       /* VACUUM (non-FULL),ANALYZE, CREATE
  7.                                          * INDEX CONCURRENTLY */
  8. #define ShareLock                5        /* CREATE INDEX (WITHOUT CONCURRENTLY) */
  9. #define ShareRowExclusiveLock  6        /* like EXCLUSIVE MODE, but allows ROW
  10.                                          * SHARE */
  11. #define ExclusiveLock          7        /* blocks ROW SHARE/SELECT...FOR
  12.                                          * UPDATE */
  13. #define AccessExclusiveLock       8        /* ALTER TABLE, DROP TABLE, VACUUM
  14.                                          * FULL, and unqualified LOCK TABLE */
复制代码
补充:Postgresql死锁的处理惩罚
背景:
对表举行所有操作都卡住,原因大概是更新表时导致这个表死锁了,开始举行排查
办理一:查询pg_stat_activity有没有记载

pg版本10.2
  1. select pid,query,* from pg_stat_activity where datname='死锁的数据库' and wait_event_type = 'Lock';
  2. select pg_cancel_backend('死锁那条数据的pid值');##只能杀死select 语句, 对其他语句不生效
  3. pg_terminate_backend('死锁那条数据的pid值');#select,drop等各种操作
复制代码
实验后发现select和delete表时正常实验,但truncate和drop表时会不停运行,也不报错。
“drop table” 和 “truncate table” 必要申请排它锁"ACCESS EXCLUSIVE", 实验这个命令卡住时,阐明此时这张表上还有操作正在举行,比如查询等,
那么只有等待这个查询操作完成,“drop table” 或"truncate table"大概增长字段的SQL才能获取这张表上的 "ACCESS EXCLUSIVE"锁,操作才能举行下去。
办理二:查询pg_locks是否有这个对象的锁
  1. select oid,relname from pg_class where relname='table name';
  2. select locktype,pid,relation,mode,granted,* from pg_locks where relation= '上面查询出来的oid';
  3. select pg_terminate_backend('进程ID');
复制代码
题目办理!!!
坑:一开始不知道pg_cancel_backend(‘死锁那条数据的pid值');##只能杀死select 语句, 对其他语句不生效,杀了历程查询发现还存在,反复杀反复存在,换了pg_terminate_backend(‘历程ID')题目就办理了。
以上为个人履历,希望能给各人一个参考,也希望各人多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作