通过pg_replication_slot_advance推进了confirmed_flush_lsn,但是restart_lsn没有推进,此时日志没有清理;
如果通过enable_xlog_prune=true和max_size_for_xlog_prune 可以强制清理日志吗?复制槽会同步推进吗?
主机清理xlog逻辑:
wal_keep_segments保留日志大小,也就是正常情况下只保留wal_keep_segments大小的日志,然后同时结合如下情况进行日志清理:
(1)如果是SNDROLE_PRIMARY_BUILDSTANDBY状态,表示有备机在build,此时强制保留所有日志,任何参数设置的值都不起作用。
(2)如果当前是一主多备的部署,并且不是所有备机都存活的情况,如果enable_xlog_prune=true,则会根据max_size_for_xlog_prune参数来清理主机xlog,如果enable_xlog_prune=false,则强制保留所有日志,任何参数设置的值都不起作用。
(3)正常运行状态,且集群normal,那么会计算keep = repl_slot_state.min_required表示当前所有备机中同步xlog最小的位置,然后将keep位置与 wal_keep_segments参数需要保留的日志进行对比,来找到最小保留的日志位置,然后再将最小位置之前的日志进行清理。
主备部署方式的日志清理 和备机日志同步关系较大,因此需要保证主备之前同步复制正常。
日志清理和复制槽推荐没有强制关系,复制槽的推进只依赖于同步备机接收日志的位置。