天天看点

在Postgres表中找到并杀死locks在Postgres表中找到并杀死locks

在Postgres表中找到并杀死locks

检测是否存在lock

在表上执行一个简单的操作来判断表是否已锁。如果锁上,则执行不成功。例如:

postgres=> delete from <tablename> where id = 154193;
           

列出locks

Postgres数据库包含很多统计信息,可以使用这些统计信息来检测数据库问题,在这里使用的是pg_locks,pg_class表。执行以下命令

select pid 
from pg_locks l 
join pg_class t on l.relation = t.oid 
where t.relkind = 'r'
and t.relname = '<tablename>';
           

得到以下输出:

pid
-------
 11330
 16376
 16329
 11903
(4 rows)
           

证明一些进程ID在那张表上创建了lock。

找到lock对应的查询

select pid, state, usename, query, query_start 
from pg_stat_activity 
where pid in (
  select pid from pg_locks l 
  join pg_class t on l.relation = t.oid 
  and t.relkind = 'r' 
  where t.relname = 'search_hit'
);
           

输出会得到进程ID,用户名,执行的查询。

杀死locks

在psql控制台上,执行以下命令杀死locks

postgres=>SELECT pg_cancel_backend(11903);
或者
postgres=>SELECT pg_terminate_backend(11903);
           

检测locks是否移除

在表上执行一个简单的操作验证一下锁是否解除。

继续阅读