pg_wal_replay_wait()

等待WAL重放的存储过程
此条目涉及一个提议的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.

分类

复制系统函数WAL已撤回

另请参见

pg_wal_replay_wait_status()pg_wal_replay_pause()pg_last_wal_replay_lsn()

反馈

提交任何关于 "pg_wal_replay_wait()" 的评论、建议或更正 在此处