此条目与一个提议的PostgreSQL功能相关,该功能在公开发布之前已被撤回。
pg_wal_replay_wait() 是一个系统函数(过程),用于等待 WAL 重放到指定的 LSN。也可以选择性地指定一个超时时间(以毫秒为单位)。
pg_wal_replay_wait() 在 PostgreSQL 18 中添加,但后来被撤销。
用法
pg_wal_replay_wait (target_lsnpg_lsn,timeoutbigintDEFAULT0,no_errorbooleanDEFAULTfalse ) →void
timeout 以毫秒为单位指定。
如果 no_error 设置为 TRUE,则在指定的 timeout 值超过,或者在达到 target_lsn 之前服务器被提升(promoted)的情况下,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 文档: 恢复同步过程和函数
