log_lock_failures
Fact — 官方简述译文:记录锁获取失败。
身份
生命周期
| Fact | 值 |
|---|---|
| 首次观测 | PG18 |
| 在档版本 | PG18–19 Beta 3 |
| 移除版本 | 否 |
| 引入提交 | 73bdcfab35ec — Rename log_lock_failure GUC to log_lock_failures for consistency. |
| 提交日期 | 2025-06-03 |
| Discussion | 讨论 1 |
默认值变迁
| 版本 | 原始 boot_val |
单位 | 人类可读值 |
|---|---|---|---|
| PG18–19 Beta 3 | off |
— | off |
机制详解
log_lock_failures 引入于 PostgreSQL 18,在受支持的锁获取失败时输出详细消息。PostgreSQL 18 当前支持范围明确只有 SELECT … NOWAIT 导致的锁失败;它不是所有 NOWAIT 类命令或所有锁错误的通用日志器。
它属于 SUPERUSER 上下文。超级用户或获授相应 SET 权限的角色可按会话修改,因此角色/数据库默认值与连接池重置行为决定哪些会话产生记录。
它补充 log_lock_waits:后者记录超过 deadlock_timeout 的等待,而 SELECT … NOWAIT 会立即失败并可由本参数记录。详细消息可能暴露关系、锁与语句上下文,必须遵循常规日志访问策略。
调优建议
Advice。 以下建议是工作负载起点,必须用真实测量验证。
| 场景 | 建议 |
|---|---|
| OLTP | 在 SELECT … NOWAIT 失败能解释延迟或重试行为的会话中启用,并把记录与应用重试及锁持有者关联;不要期待它覆盖无关锁错误。 |
| OLAP | 使用 SELECT … NOWAIT 的分析读取可在争用调查期间启用;若没有这类命令则保持 off,因为它不提供更广泛等待遥测。 |
| 小规格 | 正常日志量较低,但启用前仍应验证日志访问与保留。与 log_lock_waits 和死锁诊断配合,而不是把它当作替代品。 |
Pigsty 取值
以下值来自固定 8 核、32 GiB、100 GiB SSD 夹具,并按 PG19 Beta 3 渲染当前 Pigsty 模板;这不表示 Pigsty 当前支持该历史或测试版本。
| 模板 | 有效值 | 与上游 boot 比较 | 源表达式 |
|---|---|---|---|
| OLTP | on |
不同于 boot 值 | 'on' |
| OLAP | 未修改 | — | — |
| CRIT | on |
不同于 boot 值 | 'on' |
| TINY | 未修改 | — | — |
Advice — 待人工复核。 当前 Pigsty 模板投影事实:OLTP: PG18–19 Beta 3 = on (dcs);OLAP: PG18–19 Beta 3 未修改;CRIT: PG18–19 Beta 3 = on (dcs);TINY: PG18–19 Beta 3 未修改。 建议(待人工复核)——编辑推断:该覆盖似乎旨在为最需要立即锁失败重试或审计诊断的模板保留 SELECT … NOWAIT 失败详情;PostgreSQL 18 的该 GUC 不提供更广泛的锁失败覆盖。
常见坑
- 误以为 PostgreSQL 18 会记录所有锁获取失败;当前只支持 SELECT … NOWAIT。
- 用它替代 log_lock_waits,而立即失败与等待超过 deadlock_timeout 是不同事件。
- 只在一个池化会话中启用,却认为其他会话继承了该值。
- 在没有适当日志访问、脱敏与保留控制时保存详细锁和语句上下文。
关联参数
log_checkpoints · log_autovacuum_min_duration · log_lock_waits · log_temp_files · log_replication_commands