Last active
April 21, 2018 19:29
-
-
Save bradurani/ddaef800eefd692b77ab6eaf7d3df3cb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--lock monitor | |
CREATE VIEW lock_monitor AS( | |
SELECT | |
COALESCE(blockingl.relation::regclass::text,blockingl.locktype) as locked_item, | |
now() - blockeda.query_start AS waiting_duration, blockeda.pid AS blocked_pid, | |
blockeda.query as blocked_query, blockedl.mode as blocked_mode, | |
blockinga.pid AS blocking_pid, blockinga.query as blocking_query, | |
blockingl.mode as blocking_mode | |
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) OR | |
(blockingl.relation=blockedl.relation AND blockingl.locktype=blockedl.locktype) | |
) AND blockedl.pid != blockingl.pid) | |
JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid | |
AND blockinga.datid = blockeda.datid | |
WHERE NOT blockedl.granted | |
AND b | |
--recursive lock monitor | |
WITH RECURSIVE | |
c(requested, current) AS | |
( VALUES | |
('AccessShareLock'::text, 'AccessExclusiveLock'::text), | |
('RowShareLock'::text, 'ExclusiveLock'::text), | |
('RowShareLock'::text, 'AccessExclusiveLock'::text), | |
('RowExclusiveLock'::text, 'ShareLock'::text), | |
('RowExclusiveLock'::text, 'ShareRowExclusiveLock'::text), | |
('RowExclusiveLock'::text, 'ExclusiveLock'::text), | |
('RowExclusiveLock'::text, 'AccessExclusiveLock'::text), | |
('ShareUpdateExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text), | |
('ShareUpdateExclusiveLock'::text, 'ShareLock'::text), | |
('ShareUpdateExclusiveLock'::text, 'ShareRowExclusiveLock'::text), | |
('ShareUpdateExclusiveLock'::text, 'ExclusiveLock'::text), | |
('ShareUpdateExclusiveLock'::text, 'AccessExclusiveLock'::text), | |
('ShareLock'::text, 'RowExclusiveLock'::text), | |
('ShareLock'::text, 'ShareUpdateExclusiveLock'::text), | |
('ShareLock'::text, 'ShareRowExclusiveLock'::text), | |
('ShareLock'::text, 'ExclusiveLock'::text), | |
('ShareLock'::text, 'AccessExclusiveLock'::text), | |
('ShareRowExclusiveLock'::text, 'RowExclusiveLock'::text), | |
('ShareRowExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text), | |
('ShareRowExclusiveLock'::text, 'ShareLock'::text), | |
('ShareRowExclusiveLock'::text, 'ShareRowExclusiveLock'::text), | |
('ShareRowExclusiveLock'::text, 'ExclusiveLock'::text), | |
('ShareRowExclusiveLock'::text, 'AccessExclusiveLock'::text), | |
('ExclusiveLock'::text, 'RowShareLock'::text), | |
('ExclusiveLock'::text, 'RowExclusiveLock'::text), | |
('ExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text), | |
('ExclusiveLock'::text, 'ShareLock'::text), | |
('ExclusiveLock'::text, 'ShareRowExclusiveLock'::text), | |
('ExclusiveLock'::text, 'ExclusiveLock'::text), | |
('ExclusiveLock'::text, 'AccessExclusiveLock'::text), | |
('AccessExclusiveLock'::text, 'AccessShareLock'::text), | |
('AccessExclusiveLock'::text, 'RowShareLock'::text), | |
('AccessExclusiveLock'::text, 'RowExclusiveLock'::text), | |
('AccessExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text), | |
('AccessExclusiveLock'::text, 'ShareLock'::text), | |
('AccessExclusiveLock'::text, 'ShareRowExclusiveLock'::text), | |
('AccessExclusiveLock'::text, 'ExclusiveLock'::text), | |
('AccessExclusiveLock'::text, 'AccessExclusiveLock'::text) | |
), | |
l AS | |
( | |
SELECT | |
(locktype,DATABASE,relation::regclass::text,page,tuple,virtualxid,transactionid,classid,objid,objsubid) AS target, | |
virtualtransaction, | |
pid, | |
mode, | |
granted | |
FROM pg_catalog.pg_locks | |
), | |
t AS | |
( | |
SELECT | |
blocker.target AS blocker_target, | |
blocker.pid AS blocker_pid, | |
blocker.mode AS blocker_mode, | |
blocked.target AS target, | |
blocked.pid AS pid, | |
blocked.mode AS mode | |
FROM l blocker | |
JOIN l blocked | |
ON ( NOT blocked.granted | |
AND blocker.granted | |
AND blocked.pid != blocker.pid | |
AND blocked.target IS NOT DISTINCT FROM blocker.target) | |
JOIN c ON (c.requested = blocked.mode AND c.current = blocker.mode) | |
), | |
r AS | |
( | |
SELECT | |
blocker_target, | |
blocker_pid, | |
blocker_mode, | |
'1'::int AS depth, | |
target, | |
pid, | |
mode, | |
blocker_pid::text || ',' || pid::text AS seq | |
FROM t | |
UNION ALL | |
SELECT | |
blocker.blocker_target, | |
blocker.blocker_pid, | |
blocker.blocker_mode, | |
blocker.depth + 1, | |
blocked.target, | |
blocked.pid, | |
blocked.mode, | |
blocker.seq || ',' || blocked.pid::text | |
FROM r blocker | |
JOIN t blocked | |
ON (blocked.blocker_pid = blocker.pid) | |
WHERE blocker.depth < 1000 | |
) | |
SELECT * FROM r | |
ORDER BY seq; | |
--cancel long running queries | |
SELECT | |
pg_cancel_backend(pid), | |
now()-pg_stat_activity.query_start AS duration, | |
query, | |
state | |
FROM pg_stat_activity | |
WHERE (now()-pg_stat_activity.query_start) > interval '1 day'; | |
SELECT pg_sleep(30); | |
SELECT | |
pg_terminate_backend(pid), | |
now()-pg_stat_activity.query_start AS duration, | |
query, | |
state | |
FROM pg_stat_activity | |
WHERE (now()-pg_stat_activity.query_start) > interval '1 day'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment