postgresql truncate table 卡死

缘由

工作中遇到一个奇葩的问题,记录下来。
调度系统中每天凌晨都会同步业务库的线上表某表到分析库中,假设表名字为order_table。同步的过程是先将分析库中的同构表清空,然后拉取全量数据到空表中。
某天发现truncate table order_table;这句居然卡了一个多小时还未执行完毕。

原因

postgresql 在执行drop table和truncate table时候需要先申请排它锁 ACCESS EXCLUSIVE,获取这把锁之后才可以继续执行。但是如果同时这张表上还有操作正在进行,比如select操作,那么很不幸只有等待这个查询操作完成以后,drop table和truncate table才能获取这张表上的ACCESS EXCLUSIVE锁,后续的操作才能继续执行。

杀进程

请教DBA得知如下的sql可以将正在执行的sql杀掉:

select
    pg_terminate_backend(pid),
    query
from
    pg_stat_activity
where
    query ~* 'order_table'
    and pid <> pg_backend_pid();

杀掉进程后,truncate table 就可以正常执行。

你可能感兴趣的:(pgsql)