从代码层判断 pg_basebackup 是否已正常结束 - 暨改进建议

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

标签

PostgreSQL , pg_basebackup


背景

用户通常会使用pg_basebackup来对PostgreSQL实施在线备份,对于超级大的数据库实例,可能需要备份很久。

如果将任务分解来看,假设备份是任务流中的一个步骤,如果设置了超时时间,那么在超时导致该步骤失败之后,如何判断pg_basebackup是否已执行成功?

1、从pg_basebackup的源码中分析,文件是否有备份顺序,是否可能从某些文件是否存在来判断?

2、从pg_basebackup的返回值或STDOUT中判断。

从pg_basebackup的源码中分析

pg_basebackup的源码

src/bin/pg_basebackup/pg_basebackup.c

int  
main(int argc, char **argv)  
{  
..............  
        BaseBackup();  
  
        success = true;  
        return 0;  
}  
static void  
BaseBackup(void)  
{  
        PGresult   *res;  
        char       *sysidentifier;  
        TimeLineID      latesttli;  
        TimeLineID      starttli;  
        char       *basebkp;  
        char            escaped_label[MAXPGPATH];  
        char       *maxrate_clause = NULL;  
        int                     i;  
        char            xlogstart[64];  
        char            xlogend[64];  
        int                     minServerMajor,  
                                maxServerMajor;  
        int                     serverVersion,  
                                serverMajor;  
....................  
  
        /* Free the recovery.conf contents */  
        destroyPQExpBuffer(recoveryconfcontents);  
  
        /*  
         * End of copy data. Final result is already checked inside the loop.  
         */  
        PQclear(res);  
        PQfinish(conn);  
  
        /*  
         * Make data persistent on disk once backup is completed. For tar format  
         * once syncing the parent directory is fine, each tar file created per  
         * tablespace has been already synced. In plain format, all the data of  
         * the base directory is synced, taking into account all the tablespaces.  
         * Errors are not considered fatal.  
         */  
        if (do_sync)  
        {  
                if (format == 't')  
                {  
                        if (strcmp(basedir, "-") != 0)  
                                (void) fsync_fname(basedir, true, progname);  
                }  
                else  
                {  
                        (void) fsync_pgdata(basedir, progname, serverVersion);  
                }  
        }  
  
        // 改进可以写到这个位置,用户识别后,可以删除这个文件。  
  
        if (verbose)  
                fprintf(stderr, _("%s: base backup completed\n"), progname);  
}  

在结束时,并没有特别的输出,同时对源端文件的扫描也没有特定的顺序,或者结束时,并没有写特殊的标记文件。

如果需要通过备份内容来识别pg_basebackup是否结束,需要改进pg_basebackup,建议:

1、备份开始时,在本地(目标端),写一个标签文件,记录本次备份的开始时间

2、结束时,修改这个标签文件,记录结束时间。

那么可以查看这个文件来判断pg_basebackup是否结束。

从pg_basebackup的返回值或STDOUT中判断

实际上,从pg_basebackup源码可以看到,如果备份开启了 -v 参数,那么在备份结束后,会输出日志

fprintf(stderr, _("%s: base backup completed\n"), progname);

参数

       -v  
       --verbose  
           Enables verbose mode. Will output some extra steps during startup and shutdown, as well as show the exact file name that is currently being processed if progress reporting is also enabled.  

因此我们如果记录了备份命令的标准输出,那么可以从标准输出来判断pg_basebackup是否正常结束。

pg_basebackup xxxx >log 2>&1  
  
或

pg_basebackup xxxx && echo "success" > log

备份日志输出到日志文件,如果日志文件中包含base backup completed的输出,则表示备份成功。

小结

通过本文提到的方法,可以在异步调用pg_basebackup时,判定pg_basebackup是否正常结束。

否则,用户在调用pg_basebackup超时后,无法得知其任务状态,只能删除备份的目标目录(否则会报dir already exists ERROR),重新执行pg_basebackup。对于大实例,可能永远也执行不成功。

参考

man pg_basebackup

src/bin/pg_basebackup/pg_basebackup.c

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
jenkins Java Linux
Linux(centos 7.5)安装Jenkins
Linux(centos 7.5)安装Jenkins
324 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 12: Recovery.conf 文件参数合并到 postgresql.conf
PostgreSQL 12 的一个重要变化是 recovery.conf 配置文件中的参数合并到 postgresql.conf,recovery.conf 不再使用,我们看看手册的说明,如下: 发行说明 Move recovery.
5215 0
|
11月前
|
人工智能 搜索推荐 物联网
线上共学 | Mac本地玩转大模型
本文介绍如何在Mac本地部署和使用大模型,包括基础运行、多模态扩展、交互优化、知识增强、定制进化等技术链路,并提供Ollama、Stable Diffusion、LM-Studio等工具的详细操作指南。
2889 8
|
SQL 关系型数据库 数据库
【一文搞懂PGSQL】4.逻辑备份和物理备份 pg_dump/ pg_basebackup
本文介绍了PostgreSQL数据库的备份与恢复方法,包括数据和归档日志的备份,以及使用`pg_dump`和`pg_basebackup`工具进行逻辑备份和物理备份的具体操作。通过示例展示了单库和单表的备份与恢复过程,并提供了错误处理方案。此外,还详细描述了如何利用物理备份工具进行数据损坏修复及特定时间点恢复(PITR)的操作步骤,以应对误操作导致的数据丢失问题。
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
关系型数据库 MySQL Linux
mysql 主从同步 实现增量备份
【8月更文挑战第28天】mysql 主从同步 实现增量备份
284 3
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
419 1
|
存储 缓存 监控
Etcd/Raft 原理问题之Etcd-Raft节点故障问题如何解决
Etcd/Raft 原理问题之Etcd-Raft节点故障问题如何解决
250 2
|
监控 前端开发 JavaScript
毕业设计|SpringBoot+Vue实现的在线考试系统
毕业设计|SpringBoot+Vue实现的在线考试系统
477 0
毕业设计|SpringBoot+Vue实现的在线考试系统
|
人工智能 安全 Oracle
大型网站重构指南 第1.1部分:代码静态分析 SonarQube 指南
大型网站重构指南 第1.1部分:代码静态分析 SonarQube 指南
650 0