You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pgbench是否会修改数据库?能否生成真实活动用于PostgreSQL锁测试?

解答

首先,pgbench 生成的是100%真实的数据库活动,所有执行的事务都会实际提交到你的PostgreSQL实例,产生WAL日志、占用 buffer 缓存、申请对应对象的行锁/表锁,完全不存在模拟运行的情况。你没有触发预期的锁冲突,基本都是操作配置或时序的问题,常见原因如下:

  • 操作时序无重叠:如果先跑完了pgbench压测才执行VACUUM FULL/REINDEX,两个操作没有同时访问同一对象的时间段,自然不会产生锁冲突
  • 压测时长不足:pgbench默认只会执行少量预设事务,通常几秒就会跑完,还没等你启动维护操作就已经结束。你可以通过-T参数指定压测总时长,比如pgbench -T 600 your_db_name就是持续压测10分钟,足够你同步执行维护操作
  • 操作对象不匹配:pgbench默认操作的是初始化时生成的pgbench_accounts、pgbench_branches、pgbench_history、pgbench_tellers四张测试表,如果你执行VACUUM FULL/REINDEX的是其他业务表,两个操作的访问对象完全无关,不会产生锁冲突
  • 锁持有时间过短:默认pgbench的事务都是短小快的读写请求,锁的持有时间通常在毫秒级,即使和维护操作短暂冲突也可能很快释放,很难感知到。你可以自定义pgbench的事务脚本,在事务中加入SELECT pg_sleep(10);这类语句延长事务持有锁的时间,就可以很容易触发VACUUM FULL/REINDEX所需的ACCESS EXCLUSIVE锁的等待冲突

你可以在两个操作并行运行时执行SELECT pid, query FROM pg_stat_activity WHERE wait_event_type = 'Lock';直接验证是否存在锁等待。

内容的提问来源于stack exchange,提问作者Firas Megrahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:39:02