-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsql.sql
More file actions
167 lines (142 loc) · 5.92 KB
/
sql.sql
File metadata and controls
167 lines (142 loc) · 5.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/* http://big-elephants.com/2013-09/exploring-query-locks-in-postgres/ */
/* https://www.postgresql.org/docs/9.3/view-pg-locks.html */
SELECT locktype,
virtualtransaction AS vxid,
tuple AS tup,
relation::regclass,
mode,
virtualxid AS target_vxid,
transactionid AS target_xid,
l.granted
FROM pg_catalog.pg_locks l
WHERE NOT pid = pg_backend_pid() AND
(NOT locktype = 'relation' OR granted = false)
ORDER BY vxid;
/* Translation table */
SELECT l.locktype,
l.mode,
l.pid,
l.virtualtransaction AS my_vxid,
l.virtualxid AS target_vxid,
l.transactionid AS target_xid
FROM pg_locks l
WHERE
l.mode = 'ExclusiveLock' AND
l.locktype = 'transactionid';
/* give me all non-table locks and all not-granted locks */
/* http://big-elephants.com/2013-09/exploring-query-locks-in-postgres/ */
/* https://www.postgresql.org/docs/9.3/view-pg-locks.html */
SELECT l1.locktype,
l1.pid,
l1.virtualtransaction AS vxid,
l2.transactionid AS xid,
l1.tuple AS tup,
l1.relation::regclass,
l1.mode,
l1.virtualxid AS target_vxid,
l1.transactionid AS target_xid,
l1.granted
FROM pg_catalog.pg_locks l1
JOIN pg_catalog.pg_locks l2
ON l1.virtualtransaction = l2.virtualtransaction AND
l2.locktype = 'transactionid' AND
/* l1.granted = false AND */
l2.mode = 'ExclusiveLock'
WHERE NOT l1.pid = pg_backend_pid() AND
(NOT l1.locktype = 'relation' OR l1.granted = false)
ORDER BY vxid;
/* See what queries we're stuck on */
SELECT t.pid, l.transactionid, t.state, t.query, t.waiting
FROM pg_stat_activity t
JOIN pg_locks l ON (
l.mode = 'ExclusiveLock' AND
l.locktype = 'transactionid' AND
l.pid = t.pid
)
WHERE NOT t.pid = pg_backend_pid() AND
NOT t.query LIKE '%django_migrations%';
/******************************************************************************************/
/******************************************************************************************/
/******************************************************************************************/
/* SET application_name='%your_logical_name%'; */
/* https://wiki.postgresql.org/wiki/Lock_Monitoring#Logging_for_later_analysis */
SELECT blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement,
blocking_activity.query AS current_statement_in_blocking_process,
blocked_activity.application_name AS blocked_application,
blocking_activity.application_name AS blocking_application
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;
SELECT bl.pid AS blocked_pid,
a.usename AS blocked_user,
a.query AS blocked_statement
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a ON a.pid = bl.pid
WHERE NOT bl.granted;
/* https://www.endpoint.com/blog/2014/11/12/dear-postgresql-where-are-my-logs */
show log_destination; /* stderr */
show logging_collector; /* off */
/* example from http://elioxman.blogspot.com/2013/02/postgres-deadlock.html?m=1 */
CREATE TABLE parent (
id integer PRIMARY KEY,
name text
);
CREATE TABLE child (
id integer PRIMARY KEY,
parent_id integer REFERENCES parent(id),
name text
);
BEGIN;
INSERT INTO child VALUES (3, 1, 'CHILD_A');
SELECT * from pg_sleep(10);
UPDATE parent SET name='Parent_B' WHERE id=1;
END;
BEGIN;
INSERT INTO child VALUES (4, 1, 'CHILD_B');
SELECT * from pg_sleep(10);
UPDATE parent SET name='Parent_C' WHERE id=1;
END;
BEGIN;
UPDATE parent SET name=MD5(random()::text) WHERE id=1;
INSERT INTO child VALUES (6, 1, 'CHILD_C');
SELECT * from pg_sleep(60 * 60 * 24);
END;
SELECT * FROM parent;
/* https://www.heatware.net/databases/how-view-see-table-row-locks-postgres/ */
/* actually gives me something */
SELECT t.relname, l.locktype, l.pid, l.mode, l.granted,
l.page, l.tuple, l.virtualxid, l.transactionid
FROM pg_locks l
JOIN pg_stat_all_tables AS t
ON l.relation=t.relid
WHERE t.relname NOT IN ('pg_class', 'pg_index', 'pg_namespace')
ORDER BY l.pid, l.relation ASC;
/* http://big-elephants.com/2013-09/exploring-query-locks-in-postgres/ */
SELECT blockeda.pid AS blocked_pid, blockeda.query as blocked_query,
blockinga.pid AS blocking_pid, blockinga.query as blocking_query
FROM pg_catalog.pg_locks blockedl
JOIN pg_stat_activity blockeda ON blockedl.pid = blockeda.pid
JOIN pg_catalog.pg_locks blockingl ON
(blockingl.transactionid=blockedl.transactionid
AND blockedl.pid != blockingl.pid)
JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid
WHERE NOT blockedl.granted;
/* SET deadlock_timeout = 60000; /1* 1m. Timeout is in milliseconds. *1/ */
/* SHOW deadlock_timeout; */