Translate into your own language

Monday, February 16, 2026

 ============To check the locking and blocking===============

Query to be used mostly -----

SELECT

    activity.pid                AS blocked_pid,

    activity.usename            AS blocked_user,

    activity.application_name   AS blocked_app,

    activity.client_addr        AS blocked_client,

    activity.wait_event_type,

    activity.wait_event,

    now() - activity.query_start AS blocked_duration,

    activity.query              AS blocked_query,

    blocking.pid                AS blocking_pid,

    blocking.usename            AS blocking_user,

    blocking.application_name   AS blocking_app,

    blocking.client_addr        AS blocking_client,

    blocking.query              AS blocking_query,

    now() - blocking.query_start AS blocking_query_duration

FROM pg_stat_activity AS activity

JOIN pg_stat_activity AS blocking

  ON blocking.pid = ANY (pg_blocking_pids(activity.pid))

ORDER BY blocked_duration DESC;

--------------------------------------------------------------------------------------------------------------
1. To check the locking and blocking(Main query to use) 

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 blockinga.datname = current_database();


-[ RECORD 1 ]----+-------------------------------------------------------------------------------

locked_item      | transactionid

waiting_duration | 04:01:41.317819

blocked_pid      | 25192

blocked_query    | SELECT DISTINCT t.schemaname, t.tablename                                     +

                 |   FROM pg_catalog.pg_publication_tables t                                     +

                 |  WHERE t.pubname IN ('znwuserspublication')

blocked_mode     | ShareLock

blocking_pid     | 13747

blocking_query   | INSERT INTO nwdev.nsNWCustomerUsageAggregate as a                             +

                 |  VALUES ($1, to_jsonb($2::jsonb), to_jsonb($3::jsonb), $4, $5, $6, $7, $8, $9)

blocking_mode    | ExclusiveLock


prod=>


====================How to Kill long-running PostgreSQL query================

2. How to Kill long-running PostgreSQL query

In case you don't want a query to continue running inside the database, you can use the pid (process ID) from the pg_stat_activity

or pg_locks views to terminate the running process.

pg_cancel_backend(pid) will attempt to gracefully kill a running query process.

pg_terminate_backend(pid) will immediately kill the running query process, but potentially have side affects across additional

queries running on your database server. The full connection may be reset when running pg_terminate_backend.

pg_cancel_backend('pid')

select pg_terminate_backend('pid')

6419

3780

3779

select pg_terminate_backend('6419');

pg_terminate_backend('3780');

pg_terminate_backend('3779');


========================Dynamic Query to kill multiple sessions===================

3. Dynamic Query to kill multiple sessions

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session where status='INACTIVE';


SELECT pg_terminate_backend(pid)

FROM pg_stat_activity

WHERE datname = 'Database_Name'

AND pid <> pg_backend_pid()

AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled') 

AND state_change < current_timestamp - INTERVAL '15' MINUTE;

SELECT pg_terminate_backend(pid) FROM pg_stat_activity

WHERE datname = 'databasename'

AND pid <> pg_backend_pid()

AND state in ('idle');


====IMP - To kill all the active session in the database -

https://www.dbvis.com/thetable/how-to-kill-all-connections-to-a-database-in-postgresql/#:~:text=Dropping%20All%20Active%20Connections%20to%20a%20PostgreSQL%20Database&text=1%20SELECT%20pg_terminate_backend(pid)%202,want%20to%20close%20sessions%20for

SELECT

 pg_terminate_backend(pid)

FROM

 pg_stat_activity

WHERE

 datname = 

'QUARANTINE'

AND

 leader_pid 

IS NULL

;

-------------------To monitor an activity

SELECT pid,

       usename,

       datname,

       state,

       query_start,

       now() - query_start AS duration,

       query

FROM pg_stat_activity

WHERE query ILIKE '%DROP%';

=====================Locking and Blocking=======================

4. . To find the locks in the database.

select

relname as relation_name,

query,

pg_locks.*

from pg_locks

join pg_class on pg_locks.relation = pg_class.oid

join pg_stat_activity on pg_locks.pid = pg_stat_activity.pid


======================How to Find blocked query and blocking queries=============

5. . How to Find blocked query and blocking queries


SELECT

activity.pid,

activity.usename,

activity.query,

blocking.pid AS blocking_id,

blocking.query AS blocking_query

FROM pg_stat_activity AS activity

JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(activity.pid));


Output -


prod-> JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(activity.pid));

 pid | usename | query | blocking_id | blocking_query

-----+---------+-------+-------------+----------------

(0 rows)


================== How to View the Locks on Tables using pg_lock===============


6.  How to View the Locks on Tables using pg_lock


select * from pg_locks;


        How to find locks with table names and queries


select relname as relation_name, query, pg_locks.* from pg_locks

join pg_class on pg_locks.relation = pg_class.oid

join pg_stat_activity on pg_locks.pid = pg_stat_activity.pid;


==========================================================================


======To kill all locked sessions in PostgreSQL, you can follow these steps==========

1.  Identify Locked Sessions-


SELECT pg_stat_activity.pid, pg_stat_activity.query, pg_locks.locktype, pg_locks.mode

FROM pg_stat_activity

JOIN pg_locks ON pg_stat_activity.pid = pg_locks.pid

WHERE pg_locks.granted = 'f';


2. Terminate the Locked Sessions

SELECT pg_terminate_backend(pg_stat_activity.pid)

FROM pg_stat_activity

JOIN pg_locks ON pg_stat_activity.pid = pg_locks.pid

WHERE pg_locks.granted = 'f';


No comments:

Post a Comment