缘由
工作中遇到一个奇葩的问题,记录下来。
调度系统中每天凌晨都会同步业务库的线上表某表到分析库中,假设表名字为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 就可以正常执行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。