工做中遇到一個奇葩的問題,記錄下來。
調度系統中天天凌晨都會同步業務庫的線上表某表到分析庫中,假設表名字爲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