此条目涉及一个提议的PostgreSQL功能,该功能在公开发布之前已被撤回。
pg_wal_replay_wait()
是一个用于等待WAL重放到指定LSN的系统函数(存储过程)。可以可选地指定超时时间(以毫秒为单位)。
pg_wal_replay_wait()
在 PostgreSQL 18 中添加,但随后被回退。
用法
pg_wal_replay_wait (target_lsn
pg_lsn
,timeout
bigint
DEFAULT
0
,no_error
boolean
DEFAULT
false ) →void
timeout
以毫秒为单位指定。
如果 no_error
设置为 TRUE
,则如果指定的 timeout
值超过,或者在达到 target_lsn
之前服务器被提升,pg_wal_replay_wait()
不会抛出 ERROR
。在这种情况下,其结果状态可以使用函数 pg_wal_replay_wait_status()
查询。
请注意,pg_wal_replay_wait()
作为存储过程实现,必须通过 CALL
命令执行。
更改历史
pg_wal_replay_wait()
最初在 PostgreSQL 17 中添加 (提交 06c418e1),但随后被回退 (提交 772faafc)。
示例
pg_wal_replay_wait()
的基本用法示例
postgres=# CALL pg_wal_replay_wait('0/4FDFAFF0'); CALL
调用带有达到超时的 pg_wal_replay_wait()
postgres=# CALL pg_wal_replay_wait('0/820A21B2', 1000); ERROR: timed out while waiting for target LSN 0/820A21B2 to be replayed; current replay LSN 0/764D55F0 Time: 1001.330 ms (00:01.001)
如果 no_error
参数设置为 TRUE
,则前面示例中显示的 ERROR
将被抑制,并且可以使用函数 pg_wal_replay_wait_status()
查询执行状态。
postgres=# CALL pg_wal_replay_wait('0/820A21B2', 1000, true); CALL postgres=# SELECT pg_wal_replay_wait_status(); pg_wal_replay_wait_status --------------------------- timeout (1 row)
pg_wal_replay_wait()
只能在物理备机上执行。
postgres=# CALL pg_wal_replay_wait('0/2BBF05B8'); ERROR: recovery is not in progress DETAIL: Recovery ended before replaying target LSN 0/820A21B2; last replay LSN 0/0.
pg_wal_replay_wait()
不能在隔离级别高于 READ COMMITTED
的事务中执行。
postgres=# BEGIN; BEGIN postgres=*# SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET postgres=*# CALL pg_wal_replay_wait('0/2BBF05B8'); ERROR: pg_wal_replay_wait() must be only called without an active or registered snapshot DETAIL: Make sure pg_wal_replay_wait() isn't called within a transaction with an isolation level higher than READ COMMITTED, another procedure, or a function. postgres=!#
因为它是一个存储过程而不是函数,所以尝试通过 SELECT
调用它将不可避免地失败。
postgres=# SELECT pg_wal_replay_wait('0/0'); ERROR: pg_wal_replay_wait(unknown) is a procedure LINE 1: SELECT pg_wal_replay_wait('0/0'); ^ HINT: To call a procedure, use CALL.
参考文献
- PostgreSQL 18 文档: 恢复同步过程和函数