工做中遇到一个奇葩的问题,记录下来。
调度系统中天天凌晨都会同步业务库的线上表某表到分析库中,假设表名字为order_table。同步的过程是先将分析库中的同构表清空,而后拉取全量数据到空表中。
某天发现truncate table order_table;
这句竟然卡了一个多小时还未执行完毕。sql
postgresql 在执行drop table和truncate table时候须要先申请排它锁 ACCESS EXCLUSIVE,获取这把锁以后才能够继续执行。可是若是同时这张表上还有操做正在进行,好比select操做,那么很不幸只有等待这个查询操做完成之后,drop table和truncate table才能获取这张表上的ACCESS EXCLUSIVE锁,后续的操做才能继续执行。post
请教DBA得知以下的sql能够将正在执行的sql杀掉:postgresql
select pg_terminate_backend(pid), query from pg_stat_activity where query ~* 'order_table' and pid <> pg_backend_pid();
杀掉进程后,truncate table 就能够正常执行。code