數據庫系統運行時,在某些業務場景下查詢語句會被阻塞,導致語句運行時間過長,可以強制結束有問題的會話。
操作步驟
步驟 1 使用DAS或者gsql連接實例。
步驟 2 查看阻塞的查詢語句及阻塞查詢的表、模式信息。
SELECT w.query as waiting_query,?
w.pid as w_pid,?
w.usename as w_user,?
l.query as locking_query,?
l.pid as l_pid,?
l.usename as l_user,?
t.schemaname || '.' || t.relname as tablename?
from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid?
and not l1.granted join pg_locks l2 on l1.relation = l2.relation?
and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid?
where w.waiting;
該查詢返回線程ID、用戶信息、查詢狀態,以及導致阻塞的表、模式信息。
步驟 3 使用如下命令結束相應的會話。
SELECT PG_TERMINATE_BACKEND(139834762094352);
其中,139834762094352為線程ID。
顯示類似如下信息,表示結束會話成功。
?PG_TERMINATE_BACKEND?
----------------------?
?t?
(1 row)
顯示類似如下信息,表示用戶正在嘗試結束當前會話。
FATAL:? terminating connection due to administrator command?
FATAL:? terminating connection due to administrator command
說明:
- gsql客戶端使用PG_TERMINATE_BACKEND函數結束當前正在執行會話的后臺線程時,如果當前的用戶是初始用戶,客戶端不會退出而是自動重連,即還會返回“The connection to the server was lost. Attempting reset: Succeeded.”;否則客戶端會重連失敗,即返回“The connection to the server was lost. Attempting reset: Failed.”。這是因為只有初始用戶可以免密登錄,普遍用戶不能免密登錄,從而重連失敗。
- 對于使用PG_TERMINATE_BACKEND函數結束非活躍的后臺線程時。如果打開了線程池,此時空閑的會話沒有線程ID,無法結束會話。非線程池模式下,結束的會話不會自動重連。