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的输出,抽查一些日志看是否还存在,检查磁盘空间是否已释放。

相关推荐
程序员学习随笔11 小时前
PostgreSQL技术内幕21:SysLogger日志收集器的工作原理
数据库·postgresql
秦时明月之君临天下11 小时前
PostgreSQL标识符长度限制不能超过63字节
数据库·postgresql
Amd79416 小时前
PostgreSQL 的历史
postgresql·开源软件·计算机科学·软件开发·关系型数据库·数据库技术·数据库历史
gis分享者18 小时前
麒麟V10系统,postgres+postgis安装,保姆级教程,包含所有安装包
postgresql·安装·postgis·麒麟系统
赵渝强老师2 天前
【赵渝强老师】PostgreSQL的参数文件
数据库·postgresql
YRr YRr5 天前
解决 Ubuntu 20.04 上因 postmaster.pid 文件残留导致的 PostgreSQL 启动失败问题
linux·ubuntu·postgresql
vvw&6 天前
如何在 Ubuntu 22.04 上安装 pgAdmin:一个 PostgreSQL 管理工具
linux·运维·服务器·ubuntu·postgresql·开源软件·pgadmin
小袁搬码6 天前
PostgreSQL17.x数据库备份命令及语法说明
数据库·postgresql·pg数据库备份
孤傲小二~阿沐8 天前
PostgreSQL的学习心得和知识总结(一百六十三)|深入理解PostgreSQL数据库之 GUC参数compute_query_id 的使用和实现
数据库·postgresql
尚雷55808 天前
PostgreSQL 常用运维SQL整理
运维·sql·postgresql