关于 PSQLException 的问题:用户持有共享缓冲区 pin 的时间太长

Son*_*Son 6 postgresql amazon-rds

我最近遇到一个奇怪的错误,我不太明白可能导致它的原因:

caused by org.postgresql.util.PSQLException: ERROR: canceling statement due to conflict with recovery Detail: User was holding shared buffer pin for too long

我为每个查询设置了 10 秒的固定超时,因此任何长时间运行的查询都应该终止,并且出现我期望看到的错误消息User query get cancelled by user request。然而,我有时会看到这一点,但上面的内容也确实令人困惑。此外,只有当我看到 RDS 副本存在高延迟时,它才会出现,然后在 5、10 分钟后自行解决。

我尝试在本地重现这个问题,但没有成功。任何想法将不胜感激!

jja*_*nes 7

如果重播过程已经落后超过 max_standby_streaming_delay (或 max_standby_archive_delay),那么它将立即终止任何阻碍的事情。如果落后较少,那么它只愿意等待,直到达到该延迟。换句话说, max_standby_streaming_delay 为整个系统设置宽限期,而不是为系统内的每个单独操作设置宽限期。

因此,如果 max_standby_streaming_delay 设置为 30 秒,但重播过程已经落后 28 秒,那么“太长”而无法容纳缓冲区 pin 可能是 2 秒。如果已经落后超过 30 秒,那么几纳秒可能“太长”——刚好足以检测到阻塞,然后发送、接收和处理信号。