# BufferPin 等待

> 后端需要独占缓冲区 pin，但另一个后端仍持有 pin。
---

`BufferPin` 类只有一个核心事件，也叫 [BufferPin](buffer-pin/)。它表示 PostgreSQL 需要独占访问某个共享缓冲区，但另一个后端仍钉住该页，使其不能被移除或进行结构修改。

## 持续出现就值得怀疑 {#how-to-read}

执行器检查页面时，pin 很正常而且生命周期很短。持续的独占 pin 等待并不常见，可能来自另一个会话保持游标打开、执行器停在某页，或并发索引工作需要删除/回收该页。

- **正常：** 扫描或索引维护期间孤立的亚秒级样本。
- **关注：** 同一前台会话在 BufferPin 上停留超过一秒。
- **紧急：** 大量会话排队、索引清理/DDL 无法推进，或持有游标的会话空闲却仍握着 pin。

## 应该检查什么 {#diagnosis}

1. 确认等待查询及其关系锁。
2. 查找长游标、`idle in transaction`，以及访问同一关系的执行器会话。
3. 把事件开始时间与 `VACUUM`、索引删除/回收、DDL 或长扫描关联。
4. 取消任何会话前，先保全持有者的查询与事务上下文。

## 常见误读 {#misreads}

- Buffer pin 不是重量级锁，在 `pg_locks` 中没有直接的持有者行。
- 调大 `shared_buffers` 不能让已持有的 pin 消失。
- 等待者可能是 vacuum/索引维护，而持有 pin 的应用会话看起来毫不起眼。

---

本节页面：

- [BufferPin: BufferPin](/zh/bufferpin/buffer-pin/): 等待获取 buffer 上的独占 pin。
