记一次空间告警与pg_rman keep-data-days参数研究

news2024/11/11 22:33:45

一、 背景

       收到一个磁盘空间告警,检查发现是本地备份保留比较多导致的,处理过程倒很简单,手动清理掉旧的备份(已自动备到远端服务器),告警就恢复了。

       但是检查备份脚本的时候,发现keep-data-days参数明明只设置了1,为什么本地会出现3份备份(保留了3天的备份)?

pg_rman backup -b ${BACKUP_TYPE}  -s -C -Z -P --keep-data-days=1 --keep-arclog-files=…(非完整命令)

查了下官方文档的解释…说了好像没说一样

pg_rman

二、 源码学习

1. 奇怪的第3份备份文件

       检查了下其他设置keep-data-days=1的服务器,发现都只有最近2天的备份文件,而之前在处理告警时,备份正在执行中。因此可以推测,pg_rman是在备份完成后才清理掉过期的备份文件。因此在备份期间会有3天的文件,而备完后就只有2

       要验证这个猜测,可以简单地再执行下备份,也可以从pg_rman备份源码分析。

       以下在backup.c文件的do_backup函数,可以看到pgBackupDelete函数调用是在各种备份完成之后,符合前面的结论。

int
do_backup(pgBackupOption bkupopt)
{
    parray *backup_list;
    parray *files_database;
    parray *files_arclog;
    parray *files_srvlog;
    int    ret;
    char   path[MAXPGPATH];

    /* repack the necesary options */
    int keep_arclog_files = bkupopt.keep_arclog_files;
    int keep_arclog_days  = bkupopt.keep_arclog_days;
    int keep_srvlog_files = bkupopt.keep_srvlog_files;
    int keep_srvlog_days  = bkupopt.keep_srvlog_days;
    int keep_data_generations = bkupopt.keep_data_generations;
    int keep_data_days        = bkupopt.keep_data_days;

…
    /*
     * Signal for backup_cleanup() that there may actually be some cleanup
     * for it to do from this point on.
     */
    in_backup = true;

    /* backup data */
    files_database = do_backup_database(backup_list, bkupopt);

    /* backup archived WAL */
    files_arclog = do_backup_arclog(backup_list);

    /* backup serverlog */
    files_srvlog = do_backup_srvlog(backup_list);

    pgut_atexit_pop(backup_cleanup, NULL);

    /* update backup status to DONE */
    current.end_time = time(NULL);
    current.status = BACKUP_STATUS_DONE;
   …

    /* Delete old backup files after all backup operation. */
    pgBackupDelete(keep_data_generations, keep_data_days);
    …
    return 0;
}

2. keep-data-days的含义

       3份备份的问题解决了,还剩下一个,为什么设置keep-data-days=1会保留2天的备份文件而不是1天?以下在delete.c文件的pgBackupDelete函数

/*
 * Delete backups that are older than KEEP_xxx_DAYS, or have more generations
 * than KEEP_xxx_GENERATIONS.
 */
void
pgBackupDelete(int keep_generations, int keep_days)
{
    int     i;
    parray *backup_list;
    int     existed_generations;
    bool    check_generations;
 …
    /* determine whether to check based on the given days */
    if (keep_days == KEEP_INFINITE)
    {
        check_days = false;
        strncpy(days_str, "INFINITE", lengthof(days_str));
    }
    else
    {
        check_days = true;
        snprintf(days_str, lengthof(days_str),
                "%d", keep_days);
        /*
         * Calculate the threshold day from given keep_days.
         * Any backup taken before this threshold day to be
         * a candidate for deletion.
         */
        tim = current.start_time - (keep_days * 60 * 60 * 24);
        ltm = localtime(&tim);
        ltm->tm_hour = 0;
        ltm->tm_min  = 0;
        ltm->tm_sec  = 0;
        keep_after = mktime(ltm);
        time2iso(keep_after_timestamp, lengthof(keep_after_timestamp),
                    keep_after);
    }
…
}

       可以看到最重要的一行注释:Calculate the threshold day from given keep_days. Any backup taken before this threshold day to be a candidate for deletion.

       而所谓的threshold day是怎么算的 —— tim = current.start_time - (keep_days * 60 * 60 * 24);

       以20230809为例,当keep-data-days=1,则threshold day为当前时间减1,即20230808。而在阈值日期之前的备份才是过期的,因此20230808不属于,自然也就不会被删除。而20230807就属于过期的文件,因此在备份完成后,它会被删除。

3. 如何只保留当天的备份

      有了上面的分析,其实就很简单了,就是设置keep-data-days=0。threshold day为当前时间减0,即20230809,因此当天之前的备份都是过期的,备份完成后也就会删除20230808的文件。简单测试一把:

pg_rman backup -b ${BACKUP_TYPE}  -s -C -Z -P --keep-data-days=0 --keep-arclog-files=…(非完整命令)

​​​​​​​

符合预期~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF实战项目十一(API篇):待办事项功能api接口

1、新建ToDoController.cs继承基础控制器BaseApiController,但是一般业务代码不写在控制器内,业务代码写在Service,先新建统一返回值格式ApiResponse.cs: public class ApiResponse{public ApiResponse(bool status, string mess…

科技云报道:一波未平一波又起?AI大模型再出邪恶攻击工具

AI大模型的快速向前奔跑,让我们见识到了AI的无限可能,但也展示了AI在虚假信息、深度伪造和网络攻击方面的潜在威胁。 据安全分析平台Netenrich报道,近日,一款名为FraudGPT的AI工具近期在暗网上流通,并被犯罪分子用于编…

数据包传输方式:单播、多播、广播、组播、泛播

数据包传输方式 单播、多播、广播、组播、泛播 网络中假设X代表所有的机器,Y代表X中的一部分机器,Z代表一组机器,1代表一台机器,那么 1:1 那就是单播;1:Y 那就是多播;1&#xff1…

mysql数据库如何转移到oracle

mysql数据库转移到oracle 在研发过程中,可能会用到将表数据库中的表结构及数据迁移到另外一种数据库中, 比如说从mysql中迁移到oracle中, 常用的方法有好些,如下 1、使用powerdesigner,先连接mysql然后生成mysql的p…

springboot启动忽略某些类

springboot启动忽略某些类 描述解决方案单拉一个提交,把所有的涉及kafka消费的都不注入容器通过配置ComponentScan的excludeFilters配置了不生效后续处理改之前改之后解释 总结 拆分环境 感触解决实现demo参考 描述 目前我这的开发环境和测试环境数据库是两份&#…

webshell免杀项目-潮影在线免杀平台(六)

平台地址: http://bypass.tidesec.com/web/ 注:需要先注册一个用户登录后才能使用该平台

RK3588平台开发系列讲解(进程篇)Linux进程IPC:管道的使用及原理

文章目录 一、什么是管道二、匿名管道和命名管道 如何进行选择三、管道使用案例四、管道的原理沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 今天介绍Linux进程IPC管道。 一、什么是管道 顾名思义,通常管道就是你家一端连接着水池,另一端连着水龙头的、能流通水的…

算法练习--字符串相关

文章目录 计算字符串最后一个单词的长度计算某字符出现次数明明的随机数回文字符串回文数字无重复字符的最大子串长度有效的括号罗马数字转整数字符串通配符杨辉三角查找两个字符串a,b中的最长公共子串 **找出字符串中第一个只出现一次的字符 计算字符串最后一个单词的长度 pe…

【C++】继承的概念和简单介绍、基类和派生类对象复制转换、继承中的作用域、派生类的默认成员函数

文章目录 继承1.继承的概念和简单介绍1.1继承的概念1.2继承的定义 2.基类和派生类对象复制转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承与静态成员 继承 1.继承的概念和简单介绍 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最…

深入理解Jdk5引入的Java泛型:类型安全与灵活性并存

深入理解Jdk5引入的Java泛型:类型安全与灵活性并存 ​ 在Java的中,有一个强大的工具,它可以让你在编写代码时既保持类型安全,又享受灵活性。**这个工具就是——泛型(Generics)。**本文将引导你深入了解Java…

小白到运维工程师自学之路 第七十集 (Kubernetes集群部署)

一、概述 Kubernetes(简称K8S)是一个开源的容器编排和管理平台,是由Google发起并捐赠给Cloud Native Computing Foundation(CNCF)管理的项目。它的目标是简化容器化应用的部署、扩展、管理和自动化操作。 以下是Kube…

【D3S】集成smart-doc并同步配置到Torna

目录 一、引言二、maven插件三、smart-doc.json配置四、smart-doc-maven-plugin相关命令五、推送文档到Torna六、通过Maven Profile简化构建 一、引言 D3S(DDD with SpringBoot)为本作者使用DDD过程中开发的框架,目前已可公开查看源码&#…

leetcode26-删除有序数组中的重复项

双指针—快慢指针 慢指针 slow 走在后面&#xff0c;快指针 fast 走在前面探路&#xff0c;找到一个不重复的元素的时候就让slow前进一步并赋值给它。 流程&#xff1a; 代码 class Solution { public:int removeDuplicates(vector<int>& nums) {int slow 0, fas…

【2012年专利】基于中继节点的互联网通信系统和通信路径选择方法

基于中继节点的互联网通信系统和通信路径选择方法 CN102594703A地址基于中继节点的互联网通信系统和通信路径选择方法 ,解决:服务器间直接传输时丢包率高及延时长的缺点包括:服务器之间转发数据包的中继节点计算服务器间最优传输路径的选路决策节点, 本发明涉及一种晶于中继…

【Spring专题】Spring之底层架构核心概念解析

目录 前言前置知识课程内容一、BeanDefinition&#xff1a;图纸二、BeanDefinitionReader&#xff1a;图纸读取器——Spring工厂基础设施之一2.1 AnnotatedBeanDefinitionReader2.2 XmlBeanDefinitionReader2.3 ClassPathBeanDefinitionScanner 三、BeanFactory&#xff1a;生产…

银行电子密码器也远程管理吗?操作步骤如下

企业需要在不同办公地点管理多个资金账户&#xff0c;能不能远程点按读取银行电子密码器呢&#xff1f; 三个字&#xff0c;很简单&#xff01; 可以用密码点按器&#xff01; 有了它就可以自动输入密码和读取验证码&#xff01; 第一步 用双面胶把密码器固定在点按器上&…

【UE4 RTS】04-Camera Pan

前言 本篇实现了CameraPawn的旋转功能。 效果 步骤 1. 打开项目设置&#xff0c;添加两个操作映射 2. 打开玩家控制器“RTS_PlayerController_BP”&#xff0c;新建一个浮点型变量&#xff0c;命名为“PanSpeed” 在事件图表中添加如下节点 此时运行游戏可以发现当鼠标移动…

【学习日记】【FreeRTOS】调度器函数实现详解

写在前面 本文主要是对于 FreeRTOS 中调度器函数实现的详细解释&#xff0c;代码大部分参考了野火 FreeRTOS 教程配套源码&#xff0c;作了一小部分修改。 一、MSP 和 PSP Cortex-M有两种栈空间&#xff0c;主堆栈和进程堆栈。 MSP 用于系统级别和中断处理的堆栈 MSP 用于保…

一文看懂Apipost接口自动化使用方法

随着项目研发进程的不断推进&#xff0c;软件功能不断增多&#xff0c;对于软件测试的要求也越来越高。为了提高测试效率和减少测试成本&#xff0c;许多软件测试团队借助于自动化测试工具来优化测试流程。Apipost也提供了自动化测试工具&#xff0c;在本文中&#xff0c;我们将…

Android Studio System.out.println()中文乱码

第一步&#xff1a; 打开studio64.exe.vmoptions加入-Dfile.encodingUTF-8 第二步&#xff1a; File-Settings-Editor-File Encodings 把所有的编码格式改为UTF-8 尝试跑一下代码&#xff0c;如果还不行&#xff0c;重启IDE 再试试。