max_slot_wal_keep_size
一个 GUC 参数,用于限制复制槽使用的存储量
max_slot_wal_keep_size 是一个用于限制复制槽使用的存储量的配置参数。
max_slot_wal_keep_size 在 PostgreSQL 13 中被添加。
默认值
max_slot_wal_keep_size 的默认值为:-1(无限制)。
应用更改
对 max_slot_wal_keep_size 的更改可以通过 pg_reload_conf()、pg_ctl reload 或 SIGHUP 应用。
按 PostgreSQL 版本定义
max_slot_wal_keep_size (PostgreSQL 19)
| 设置 | -1 |
| 单位 | MB |
| 类别 | 复制/发送服务器 |
| 简短描述 | 设置复制槽可以保留的最大 WAL 大小。 |
| 扩展描述 | 如果磁盘上 WAL 占用的空间达到此大小,复制槽将被标记为失败,并且段将被释放以供删除或回收。-1 表示无最大值。 |
| 上下文 | sighup |
| 变量类型 | 整数 |
| 来源 | 默认 |
| 最小值 | -1 |
| 最大值 | 2147483647 |
| 枚举值 | |
| 启动值 | -1 |
| 重置值 | -1 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
max_slot_wal_keep_size (PostgreSQL 18)
| 设置 | -1 |
| 单位 | MB |
| 类别 | 复制/发送服务器 |
| 简短描述 | 设置复制槽可以保留的最大 WAL 大小。 |
| 扩展描述 | 如果磁盘上 WAL 占用的空间达到此大小,复制槽将被标记为失败,并且段将被释放以供删除或回收。-1 表示无最大值。 |
| 上下文 | sighup |
| 变量类型 | 整数 |
| 来源 | 默认 |
| 最小值 | -1 |
| 最大值 | 2147483647 |
| 枚举值 | |
| 启动值 | -1 |
| 重置值 | -1 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
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
- 添加于 (commit c6550776)
Bug 修复
- 2021-07-16:
在槽无效后正确推进旧段的边界(commit 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 月博客文章
