PostgreSQL 锁等待
业务写入超时或长时间不返回,pg_stat_activity 中出现大量 wait_event_type = Lock;应用日志报 canceling statement due to statement timeout 或死锁。
psql -c "SELECT pid, wait_event_type, wait_event, state, query_start, query
FROM pg_stat_activity WHERE wait_event_type = 'Lock';"
查看阻塞链:
psql -c "SELECT blocked.pid AS blocked_pid, blocking.pid AS blocking_pid,
blocked.query AS blocked_query, blocking.query AS blocking_query
FROM pg_stat_activity blocked
JOIN pg_locks bl ON bl.pid = blocked.pid
JOIN pg_locks kl ON kl.locktype = bl.locktype
AND kl.database IS NOT DISTINCT FROM bl.database
AND kl.relation IS NOT DISTINCT FROM bl.relation
AND kl.page IS NOT DISTINCT FROM bl.page
AND kl.tuple IS NOT DISTINCT FROM bl.tuple
AND kl.transactionid IS NOT DISTINCT FROM bl.transactionid
JOIN pg_stat_activity blocking ON blocking.pid = kl.pid
WHERE NOT bl.granted;"
SELECT pg_terminate_backend(<PID>);CONCURRENTLY 建索引。statement_timeout 和 lock_timeout。psql — pg_stat_activity、pg_lockspg_terminate_backend — 终止会话pg_stat_statements — 慢查询pgbouncer — 连接池