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

简介:

标签

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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
jenkins Java Linux
Linux(centos 7.5)安装Jenkins
Linux(centos 7.5)安装Jenkins
292 0
|
Kubernetes 应用服务中间件 API
Kubernetes(K8S)命令指南
Kubernetes(K8S)命令指南
550 0
|
9月前
|
人工智能 搜索推荐 物联网
线上共学 | Mac本地玩转大模型
本文介绍如何在Mac本地部署和使用大模型,包括基础运行、多模态扩展、交互优化、知识增强、定制进化等技术链路,并提供Ollama、Stable Diffusion、LM-Studio等工具的详细操作指南。
2067 8
|
SQL 关系型数据库 数据库
【一文搞懂PGSQL】4.逻辑备份和物理备份 pg_dump/ pg_basebackup
本文介绍了PostgreSQL数据库的备份与恢复方法,包括数据和归档日志的备份,以及使用`pg_dump`和`pg_basebackup`工具进行逻辑备份和物理备份的具体操作。通过示例展示了单库和单表的备份与恢复过程,并提供了错误处理方案。此外,还详细描述了如何利用物理备份工具进行数据损坏修复及特定时间点恢复(PITR)的操作步骤,以应对误操作导致的数据丢失问题。
|
SQL 数据库
`UPDATE FROM` 的语法以及常见的更新操作方式
`UPDATE FROM` 的语法以及常见的更新操作方式
2922 2
|
关系型数据库 MySQL Linux
mysql 主从同步 实现增量备份
【8月更文挑战第28天】mysql 主从同步 实现增量备份
262 3
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
372 1
|
监控 前端开发 JavaScript
毕业设计|SpringBoot+Vue实现的在线考试系统
毕业设计|SpringBoot+Vue实现的在线考试系统
419 0
毕业设计|SpringBoot+Vue实现的在线考试系统
|
人工智能 安全 Oracle
大型网站重构指南 第1.1部分:代码静态分析 SonarQube 指南
大型网站重构指南 第1.1部分:代码静态分析 SonarQube 指南
589 0