跳转到主要内容

log_lock_failures

log_lock_failures 决定 PostgreSQL 是否记录锁获取失败。
说明

Fact — 官方简述译文:记录锁获取失败。

身份

类型 , bool
上游 pg_settings 类型
Context , superuser
超级用户可在运行时修改
单位 ,
原始单位
范围 ,
最后在档版本的原始上下限
枚举值 ,
非枚举类型记为 —
分类 , Reporting and Logging / What to Log
上游分类
最后 boot 值 , off
off

生命周期

Fact
首次观测 PG18
在档版本 PG18–19 Beta 3
移除版本
引入提交 73bdcfab35ec — Rename log_lock_failure GUC to log_lock_failures for consistency.
提交日期 2025-06-03
Discussion 讨论 1

默认值变迁

PG9.0–19 Beta 3 实测 boot 默认值
版本 原始 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

参考资料