在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是否移除
在表上执行一个简单的操作验证一下锁是否解除。