Skip to content

Commit 40d5fba

Browse files
authored
Merge pull request #31 from qonto/suggest-investigating-db-locks
feat: recommend to terminate over cancelling blocking queries
2 parents 0aff185 + 2c6b133 commit 40d5fba

File tree

3 files changed

+27
-17
lines changed

3 files changed

+27
-17
lines changed

content/runbooks/postgresql/PostgreSQLLongRunningQueries.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ Alert is triggered when SQL queries run for an extended period.
3232
{{% sql "../postgresql/sql/list-long-running-transactions.sql" %}}
3333
{{< /details >}}
3434

35-
1. Cancel the queries
35+
Queries could be blocked in trying to acquire a lock, so pay particular attention at the `blocked_by` column. If you identify specific queries blocking others, note down their PIDs. Below is a focused view of current locks on the database:
3636

37-
{{% sql "sql/cancel_backend.sql" %}}
37+
{{< details title="SQL" open=false >}}
38+
{{% sql "../postgresql/sql/list-ongoing-locks.sql" %}}
39+
{{< /details >}}
3840

39-
1. If queries do not get cancelled, kill them
41+
1. Terminate in priority the blocking queries, if not enough, terminate the other long running queries
4042

4143
{{% sql "sql/terminate_backend.sql" %}}
4244

content/runbooks/postgresql/sql/cancel_backend.sql

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
SELECT
2+
blocked_locks.pid AS blocked_pid,
3+
blocked_activity.usename AS blocked_user,
4+
blocking_locks.pid AS blocking_pid,
5+
blocking_activity.usename AS blocking_user,
6+
blocked_activity.query AS blocked_statement,
7+
blocking_activity.query AS current_statement_in_blocking_process
8+
FROM pg_catalog.pg_locks blocked_locks
9+
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
10+
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
11+
AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
12+
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
13+
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
14+
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
15+
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
16+
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
17+
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
18+
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
19+
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
20+
AND blocking_locks.pid != blocked_locks.pid
21+
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
22+
WHERE NOT blocked_locks.granted;

0 commit comments

Comments
 (0)