pg_switch_wal()
是一个系统函数,它强制 PostgreSQL 切换到一个新的 WAL 文件。
pg_switch_wal()
在 PostgreSQL 8.2 中添加,当时名为 pg_switch_xlog()
。
用法
pg_switch_wal() → pg_lsn
pg_switch_wal()
返回旧 WAL 文件的结束 LSN + 1。
但是,如果自上次 WAL 文件切换以来没有生成 WAL 的活动,则不会执行切换,并且将返回当前 WAL 文件的起始位置。
pg_switch_wal()
只能在主服务器上执行(即,不是只读备机)。
变更历史
- PostgreSQL 10
- 从
pg_switch_xlog()
重命名为pg_switch_wal()
(提交 806091c9)
- 从
- PostgreSQL 9.4
- 返回值类型从
text
更改为pg_lsn
(提交 6f289c2b) - 切换到新的 WAL 段时,
pg_switch_xlog()
现在会用零填充段中剩余的未使用部分,从而无需使用诸如pg_clearxlogtail
之类的实用程序(提交 9a20a9b2)<
- 返回值类型从
- PostgreSQL 8.2
- 添加为
pg_switch_xlog()
(提交 704ddaaa)
- 添加为
示例
pg_switch_wal()
的基本用法示例
postgres=# SELECT pg_switch_wal(); pg_switch_wal --------------- 0/161F710 (1 row)
如果自上次 WAL 文件切换以来没有生成 WAL 的活动,则不会创建新的 WAL 文件
postgres=# SELECT pg_walfile_name(pg_switch_wal()), pg_walfile_name(pg_switch_wal()); pg_walfile_name | pg_walfile_name --------------------------+-------------------------- 000000010000000200000086 | 000000010000000200000086 (1 row)
但是,在下面的示例中,函数 foo()
导致 WAL 文件活动,因此始终会导致 WAL 文件切换
postgres=# SELECT pg_walfile_name(pg_switch_wal()), foo(), pg_walfile_name(pg_switch_wal()); pg_walfile_name | foo | pg_walfile_name --------------------------+-----+-------------------------- 000000010000000200000097 | | 000000010000000200000098 (1 row)
尝试在备机上执行 pg_switch_wal()
postgres=# SELECT pg_switch_wal(); ERROR: recovery is in progress HINT: WAL control functions cannot be executed during recovery.
参考文献
- PostgreSQL 文档: 备份控制函数