pg_archivecleanup清理wal日志

一、 注意事项

pg_archivecleanup代码中仅进行了wal日志文件名的对比,没有实现对WAL日志名及对应生成时间的判断。在WAL日志未被重命名时,时间与日志名顺序名一致,没有问题。一旦WAL日志被重命名,pg_archivecleanup清理就可能清理掉比指定文件更新的WAL日志。

因此,在涉及主从尤其是有lag的情况下,非必要不建议使用。

cpp 复制代码
            if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) &&
                strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
            {
                char        WALFilePath[MAXPGPATH * 2]; /* the file path
                                                         * including archive */
...
                rc = unlink(WALFilePath);
                if (rc != 0)
                {
                    pg_log_error("could not remove file \"%s\": %m",
                                 WALFilePath);
                    break;
                }
            }

二、 清理步骤

真正到了必要的时刻,例如剩余磁盘空间已不足10%甚至5%,必须先检查从库所需日志与待清理日志间的新旧。

1. 检查从库所需日志

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| select pg_walfile_name(sent_lsn) sent_wal,pg_walfile_name(write_lsn) write_wal,pg_walfile_name(replay_lsn) replay_wal,write_lag,replay_lag ``from pg_stat_replication ; ``sent_wal | write_wal | write_lag --------------------------+--------------------------+------------------ ``00000003001281A1000000BE | 00000003001281A1000000BD | 02:16:25.554727 (1 row) |

以上面结果为例,write_wal 是从库正在接收的最新日志,理论上从write_wal 对应日志往前推就可以,安全起见可以再往前推一段。

2. 确认待清理日志

例如当前write_wal为 00000003001281A1000000BD,那么清理00000003001281A100000000之前的日志应该是安全的。

检查两个文件是否存在

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -``bash``-4.2$ ``cd $PGDATA``/pg_wal -``bash``-4.2$ ll -h 00000003001281A1000000BD -rw-------. 1 postgres dba 16M Jul 24 08:57 00000003001281A1000000BD -``bash``-4.2$ -``bash``-4.2$ ll -h 00000003001281A100000000 -rw-------. 1 postgres dba 16M Jul 24 08:56 00000003001281A100000000 |

3. dryrun pg_archivecleanup

先检查运行命令之后哪些文件将会被清理,有没有大于write_wal的。当然,在删除量特别大时,基本只能抽查或者搜索。

|-----------------------------------------------------------------------|
| pg_archivecleanup -d -n $PGDATA``/pg_wal 00000003001281A100000000 |

4. 清理日志

真正执行清理

|--------------------------------------------------------------------|
| pg_archivecleanup -d $PGDATA``/pg_wal 00000003001281A100000000 |

5. 清理后检查

检查主从延迟是否还正常运行,若已中断,则下面查询无结果

|--------------------------------------------|
| select * ``from pg_stat_replication; |

检查旧日志是否已清理

根据前面-n或者-d的输出,抽查一些日志看是否还存在,检查磁盘空间是否已释放。

相关推荐
倒流时光三十年4 小时前
PostgreSQL CASE 条件表达式详解
数据库·postgresql
倒流时光三十年5 小时前
PostgreSQL COALESCE 条件表达式函数详解
数据库·postgresql
雁無痕7 小时前
Postgresql启动无监听端口问题的解决
postgresql
倒流时光三十年9 小时前
PostgreSQL NULLIF 条件表达式函数详解
数据库·sql·postgresql
倒流时光三十年12 小时前
PostgreSQL VALUES 列表详解
数据库·postgresql
倒流时光三十年12 小时前
PostgreSQL GREATEST 条件表达式函数详解
服务器·数据库·postgresql
agilearchitect2 天前
asyncpg:专为 asyncio 打造的 PostgreSQL 驱动
数据库·其他·postgresql
IvorySQL2 天前
PostgreSQL 技术日报 (6月10日)|多工具版本更新,PG19 图语法落地
数据库·postgresql
IvorySQL2 天前
PostgreSQL 全球对话:开源链接世界,共建共治共享
数据库·postgresql·开源
IvorySQL2 天前
PostgreSQL 技术日报 (6月11日)|规划器扩展优化,POSETTE 大会倒计时
数据库·postgresql