postgresql truncate table 卡死

原因

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

相關文章
相關標籤/搜索