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 之前服务器被提升(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.

分类

复制, 系统函数, WAL, 已撤销

另请参阅

pg_wal_replay_wait_status(), pg_wal_replay_pause(), pg_last_wal_replay_lsn()

反馈

pg_wal_replay_wait()”的任何评论、建议或更正,请在此提交