Skip to content

Commit f4c53da

Browse files
committed
Merge branch 'master' of github.com:pgexperts/pgx_scripts
Conflicts: locks/log_transaction_locks.sh locks/transaction_locks.sql locks/transaction_locks_setup.sql
2 parents f671001 + 0f01f33 commit f4c53da

File tree

3 files changed

+144
-3
lines changed

3 files changed

+144
-3
lines changed

locks/log_transaction_locks.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/bash
2+
3+
# simple script to log transaction locks to a table
4+
# assumes that you're running it as the postgres user and don't need a password
5+
6+
# change to path of psql
7+
#PSQL='/usr/lib/postgresql/9.3/bin/psql'
8+
PSQL=/usr/bin/psql
9+
10+
# change to databases you're targeting
11+
DBNAMES='mart otherdb yetanotherdb'
12+
13+
# modify if required
14+
DBPORT='-p 5432'
15+
#DBHOST='-h 127.0.0.1'
16+
DBHOST=''
17+
18+
for DB in $DBNAMES ; do
19+
$PSQL -c "INSERT INTO log_transaction_locks SELECT * FROM log_transaction_locks_view" -U postgres $DB $DBPORT $DBHOST
20+
# su - postgres -c "$PSQL -c 'INSERT INTO log_transaction_locks SELECT * FROM log_transaction_locks_view' -U postgres $DB $DBPORT $DBHOST"
21+
done
22+
23+
exit 0

locks/transaction_locks.sql

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
-- query to analyze waiting transaction locks
2+
-- requires Postgres 9.2 or greater
3+
4+
WITH table_locks AS (
5+
select pid,
6+
relation::regclass as lockobj,
7+
case when page is not null and tuple is not null then
8+
mode || ' on ' || page::text || ':' || tuple::text
9+
else
10+
mode
11+
end as lock_mode,
12+
locktype
13+
from pg_locks
14+
join pg_database
15+
ON pg_locks.database = pg_database.oid
16+
where relation is not null
17+
and pg_database.datname = current_database()
18+
order by lockobj
19+
),
20+
locked_list AS (
21+
select pid,
22+
array_agg(lockobj) as lock_relations,
23+
array_agg(lock_mode) as lock_modes,
24+
array_agg(locktype) as lock_types
25+
from table_locks
26+
group by pid
27+
),
28+
txn_locks AS (
29+
select pid, transactionid::text as lxid, granted
30+
from pg_locks
31+
where locktype = 'transactionid'
32+
union all
33+
select pid, virtualxid::text as lxid, granted
34+
from pg_locks
35+
where locktype = 'virtualxid'
36+
),
37+
txn_granted AS (
38+
select pid, lxid from txn_locks
39+
where granted
40+
),
41+
txn_waiting AS (
42+
select pid, lxid from txn_locks
43+
where not granted
44+
)
45+
select now() as lock_ts,
46+
txn_waiting.pid as waiting_pid,
47+
txn_waiting.lxid as wait_xid,
48+
txn_granted.pid as locked_pid,
49+
waiting_proc.application_name as waiting_app,
50+
waiting_proc.client_addr as waiting_addr,
51+
waiting_proc.xact_start as waiting_xact_start,
52+
waiting_proc.query_start as waiting_query_start,
53+
waiting_proc.state_change as waiting_start,
54+
waiting_proc.query as waiting_query,
55+
locked_proc.application_name as locked_app,
56+
locked_proc.client_addr as locked_addr,
57+
locked_proc.xact_start as locked_xact_start,
58+
locked_proc.query_start as locked_query_start,
59+
locked_proc.state as locked_state,
60+
locked_proc.state_change as locked_state_start,
61+
locked_proc.query as locked_last_query,
62+
waiting_locks.lock_relations as waiting_relations,
63+
waiting_locks.lock_modes as waiting_modes,
64+
waiting_locks.lock_types as waiting_lock_types,
65+
locked_locks.lock_relations as locked_relations,
66+
locked_locks.lock_modes as locked_modes,
67+
locked_locks.lock_types as locked_lock_types
68+
from txn_waiting
69+
JOIN pg_stat_activity as waiting_proc
70+
ON txn_waiting.pid = waiting_proc.pid
71+
AND waiting_proc.datname = current_database()
72+
LEFT OUTER JOIN txn_granted
73+
ON txn_waiting.lxid = txn_granted.lxid
74+
LEFT OUTER JOIN pg_stat_activity as locked_proc
75+
ON txn_granted.pid = locked_proc.pid
76+
LEFT OUTER JOIN locked_list AS waiting_locks
77+
ON txn_waiting.pid = waiting_locks.pid
78+
LEFT OUTER JOIN locked_list AS locked_locks
79+
ON txn_granted.pid = locked_locks.pid
80+
order by waiting_pid;
81+

locks/transaction_locks_setup.sql

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,46 @@ BEGIN
124124
ON txn_granted.pid = locked_locks.pid
125125
returning waiting_pid
126126
)
127-
SELECT count(*) FROM inserter;
128-
$l$;
127+
select now() as lock_ts,
128+
txn_waiting.pid as waiting_pid,
129+
txn_waiting.lxid as wait_xid,
130+
txn_granted.pid as locked_pid,
131+
waiting_proc.application_name as waiting_app,
132+
waiting_proc.client_addr as waiting_addr,
133+
waiting_proc.xact_start as waiting_xact_start,
134+
waiting_proc.query_start as waiting_query_start,
135+
waiting_proc.state_change as waiting_start,
136+
waiting_proc.query as waiting_query,
137+
locked_proc.application_name as locked_app,
138+
locked_proc.client_addr as locked_addr,
139+
locked_proc.xact_start as locked_xact_start,
140+
locked_proc.query_start as locked_query_start,
141+
locked_proc.state as locked_state,
142+
locked_proc.state_change as locked_state_start,
143+
locked_proc.query as locked_last_query,
144+
waiting_locks.lock_relations as waiting_relations,
145+
waiting_locks.lock_modes as waiting_modes,
146+
waiting_locks.lock_types as waiting_lock_types,
147+
locked_locks.lock_relations as locked_relations,
148+
locked_locks.lock_modes as locked_modes,
149+
locked_locks.lock_types as locked_lock_types
150+
from txn_waiting
151+
JOIN pg_stat_activity as waiting_proc
152+
ON txn_waiting.pid = waiting_proc.pid
153+
AND waiting_proc.datname = current_database()
154+
LEFT OUTER JOIN txn_granted
155+
ON txn_waiting.lxid = txn_granted.lxid
156+
LEFT OUTER JOIN pg_stat_activity as locked_proc
157+
ON txn_granted.pid = locked_proc.pid
158+
LEFT OUTER JOIN locked_list AS waiting_locks
159+
ON txn_waiting.pid = waiting_locks.pid
160+
LEFT OUTER JOIN locked_list AS locked_locks
161+
ON txn_granted.pid = locked_locks.pid
162+
order by waiting_pid;
129163

164+
CREATE TABLE log_transaction_locks AS
165+
SELECT * FROM log_transaction_locks_view
166+
WHERE FALSE;
130167
END IF;
131168
END;
132-
$f$;
169+
$f$;

0 commit comments

Comments
 (0)