解决 postgreSQL truncate table过慢无响应问题

Posted by Y Cheung on Tue, Sep 25, 2018

在 postgreSQL 清空表 TRUNCATE TABLE table_name RESTART IDENTITY RESTRICT;的时候,突然发生等了很久都没反应的问题,忧郁之。

查了一下,一般遇到表操作过慢或者无响应之类的问题,可以像对操作系统一样kill掉process就好了。

在本例中, 首先使用以下语句列出相关PID

1SELECT *
2  FROM pg_locks l
3  JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
4 WHERE t.relname = 'table_name';

来查看其他别的sessions是不是占用了这张表,结果大概长下面这样

1  pid  | relname 
2-------+---------
3 31061 | table_name
4 31390 | table_name
5(2 rows)

然后把它们kill掉就好了,执行类似以下语句:

1SELECT pg_cancel_backend(31061);

如果还是kill不掉,再执行类似以下语句:

1SELECT pg_terminate_backend(31390);