max_slot_wal_keep_size
用于限制复制槽使用的存储量的配置参数
max_slot_wal_keep_size
是一个用于限制复制槽使用的存储量的 配置参数。
max_slot_wal_keep_size
在 PostgreSQL 13 中添加。
默认值
max_slot_wal_keep_size
的默认值为:-1
(无限制)。
应用更改
可以通过 pg_reload_conf()
、pg_ctl reload
或 SIGHUP
应用对 max_slot_wal_keep_size
的更改。
按PostgreSQL版本定义
max_slot_wal_keep_size (PostgreSQL 17)
设置 | -1 |
单位 | MB |
类别 | 复制 / 发送服务器 |
简短描述 | 设置复制槽可以保留的最大WAL大小。 |
额外描述 | 如果磁盘上的WAL占用此空间,则复制槽将被标记为失败,并释放段以供删除或回收。 |
上下文 | sighup |
变量类型 | 整数 |
来源 | 默认 |
最小值 | -1 |
最大值 | 2147483647 |
枚举值 | |
引导值 | -1 |
重置值 | -1 |
源文件 | |
源代码行号 | |
挂起重启 | false |
max_slot_wal_keep_size (PostgreSQL 16)
设置 | -1 |
单位 | MB |
类别 | 复制 / 发送服务器 |
简短描述 | 设置复制槽可以保留的最大WAL大小。 |
额外描述 | 如果磁盘上的WAL占用此空间,则复制槽将被标记为失败,并释放段以供删除或回收。 |
上下文 | sighup |
变量类型 | 整数 |
来源 | 默认 |
最小值 | -1 |
最大值 | 2147483647 |
枚举值 | |
引导值 | -1 |
重置值 | -1 |
源文件 | |
源代码行号 | |
挂起重启 | false |
max_slot_wal_keep_size (PostgreSQL 15)
设置 | -1 |
单位 | MB |
类别 | 复制 / 发送服务器 |
简短描述 | 设置复制槽可以保留的最大WAL大小。 |
额外描述 | 如果磁盘上的WAL占用此空间,则复制槽将被标记为失败,并释放段以供删除或回收。 |
上下文 | sighup |
变量类型 | 整数 |
来源 | 默认 |
最小值 | -1 |
最大值 | 2147483647 |
枚举值 | |
引导值 | -1 |
重置值 | -1 |
源文件 | |
源代码行号 | |
挂起重启 | false |
max_slot_wal_keep_size (PostgreSQL 14)
设置 | -1 |
单位 | MB |
类别 | 复制 / 发送服务器 |
简短描述 | 设置复制槽可以保留的最大WAL大小。 |
额外描述 | 如果磁盘上的WAL占用此空间,则复制槽将被标记为失败,并释放段以供删除或回收。 |
上下文 | sighup |
变量类型 | 整数 |
来源 | 默认 |
最小值 | -1 |
最大值 | 2147483647 |
枚举值 | |
引导值 | -1 |
重置值 | -1 |
源文件 | |
源代码行号 | |
挂起重启 | false |
max_slot_wal_keep_size (PostgreSQL 13)
设置 | -1 |
单位 | MB |
类别 | 复制 / 发送服务器 |
简短描述 | 设置复制槽可以保留的最大WAL大小。 |
额外描述 | 如果磁盘上的WAL占用此空间,则复制槽将被标记为失败,并释放段以供删除或回收。 |
上下文 | sighup |
变量类型 | 整数 |
来源 | 默认 |
最小值 | -1 |
最大值 | 2147483647 |
枚举值 | |
引导值 | -1 |
重置值 | -1 |
源文件 | |
源代码行号 | |
挂起重启 | false |
变更历史
- PostgreSQL 13
- 添加 (提交 c6550776)
错误修复
- 2021-07-16:
在槽失效后正确推进旧段范围
(提交 ead9e51e,回补到 PostgreSQL 14 和 13)
示例
如果 max_slot_wal_keep_size
设置为正值,并且复制槽变为非活动状态,则 pg_replication_slots
中的 safe_wal_size
列将包含可以写入 WAL 的字节数,然后槽失效,即下游连接无法再使用它来检索所需的WAL。
postgres=# SELECT slot_name, slot_type, active, restart_lsn, wal_status, safe_wal_size FROM pg_replication_slots; slot_name | slot_type | active | restart_lsn | wal_status | safe_wal_size -----------+-----------+--------+-------------+------------+--------------- node2 | physical | f | 0/301B830 | reserved | 15057816 (1 row)
如果槽的 restart_lsn
和当前 LSN 之间的差值超过 max_slot_wal_keep_size
中设置的量,则复制槽将失效:wal_status
将设置为 unreserved
,并且(从 PostgreSQL 14 开始)safe_wal_size
将显示负值。
postgres=# SELECT slot_name, slot_type, active, restart_lsn, wal_status, safe_wal_size FROM pg_replication_slots; slot_name | slot_type | active | restart_lsn | wal_status | safe_wal_size -----------+-----------+--------+-------------+------------+--------------- node2 | physical | f | 0/301B830 | unreserved | -80436096 (1 row)
在下一个 检查点 时,将发出如下所示的日志行
[2021-08-15 23:41:21 UTC] LOG: 00000: checkpoint starting: immediate force wait [2021-08-15 23:41:21 UTC] LOG: 00000: invalidating slot "node2" because its restart_lsn 0/301B830 exceeds max_slot_wal_keep_size
此后,wal_status
将设置为 lost
,safe_wal_size
将设置为 NULL。
postgres=# SELECT slot_name, slot_type, active, restart_lsn, wal_status, safe_wal_size FROM pg_replication_slots; slot_name | slot_type | active | restart_lsn | wal_status | safe_wal_size -----------+-----------+--------+-------------+------------+--------------- node2 | physical | f | | lost | (1 row)
参考文献
- PostgreSQL 文档: max_slot_wal_keep_size
有用链接
- PostgreSQL 13:不要让槽杀死你的主服务器 - 2ndQuadrant 2020年7月的博文