BufferPin waits
A backend needs an exclusive buffer pin while another backend still holds one.
BufferPin has one core event, also named BufferPin. It means PostgreSQL needs exclusive access to a shared buffer but another backend still pins that page so it cannot be removed or structurally changed.
Treat persistence as suspicious
Pins are normal and short-lived while executors inspect pages. A sustained exclusive-pin wait is unusual and can come from another session holding a cursor open, an executor paused on a page, or concurrent index work that needs to delete/recycle the page.
- Normal: isolated, sub-second samples during scans or index maintenance.
- Watch: the same foreground session remains on BufferPin for more than one second.
- Urgent: many sessions queue, index cleanup/DDL cannot advance, or a cursor-owning session is idle while holding the pin.
What to inspect
- Identify the waiting query and its relation locks.
- Look for long-running cursors,
idle in transaction, and executor sessions touching the same relation. - Correlate the onset with
VACUUM, index deletion/recycling, DDL, or long scans. - Preserve the holder’s query and transaction context before cancelling anything.
Common misreads
- A buffer pin is not a heavyweight lock and has no direct owner row in
pg_locks. shared_bufferssize does not make a held pin disappear.- The waiter may be vacuum/index maintenance while the application session holding the pin looks harmless.
Waiting to acquire an exclusive pin on a buffer