跳转到主要内容

简单的备份轮转命令行界面

项目描述

https://travis-ci.org/xolox/python-rotate-backups.svg?branch=master https://coveralls.io/repos/xolox/python-rotate-backups/badge.svg?branch=master

备份对你有好处。大多数人都是通过艰难的方式学习到这一点(包括我)。如今,我的Linux笔记本电脑通过将更改的文件推送到我家庭网络中的服务器上的rsync守护进程,然后使用cp -al命令创建快照,每四小时自动创建一次完整系统快照(文章Easy Automated Snapshot-Style Backups with Linux and Rsync解释了基本技术)。服务器连接了一个第二个磁盘,它异步地从主磁盘复制,这样单个磁盘故障就不会擦除所有的备份(“时间延迟复制”方面也已被证明非常有用)。

好的,很酷,现在我已经备份了所有东西,都是最新的,还可以回溯时间!但是我正像疯了一样消耗磁盘空间……一个合适的去重文件系统会非常棒,但我在运行低端的消费级硬件,比如之前ZFS的使用体验并不好。所以我不得不删除备份……

删除备份永远不会令人愉快,但一个简单且适当的轮换方案可以帮助很多。我想保持东西的可管理性,所以我编写了一个Python脚本来自动完成这项工作。多年来,我实际上编写了几个变体。因为我一直在复制粘贴这些脚本,所以我决定将主要功能集成到一个有良好文档的Python包中,并将其上传到Python包索引

《rotate-backups》包目前已在cPython 2.7、3.5+ 和 PyPy(2.7)上进行了测试。它已在Linux和Mac OS X上进行了测试,可能在其他Unix系统上也能工作,但现在肯定不会在Windows上工作。

功能

模拟运行模式

使用它。 我是认真的。如果你不这样做,并且《rotate-backups》消耗了比预期更多的备份,你没有权利抱怨 ;-)

灵活的轮换

结合每小时、每天、每周、每月和每年的保留期进行轮换。

文件名中的模糊时间戳匹配

文件和/或目录的修改时间不相关。如果你了解Python正则表达式,以下是模糊匹配的工作方式

# Required components.
(?P<year>\d{4}) \D?
(?P<month>\d{2}) \D?
(?P<day>\d{2}) \D?
(
   # Optional components.
   (?P<hour>\d{2}) \D?
   (?P<minute>\d{2}) \D?
   (?P<second>\d{2})?
)?
所有操作都记录在日志中

日志消息保存到系统日志(例如/var/log/syslog),这样你就可以在出现问题的时候追踪发生了什么。

安装

《rotate-backups》包可在PyPI上找到,这意味着安装应该非常简单,就像

$ pip install rotate-backups

实际上有很多种方法可以安装Python包(例如,每个用户的site-packages目录虚拟环境或直接在系统范围内安装),我无意在这里进行讨论,所以如果你感到害怕,请在返回这些说明之前了解一下你的选项 ;-)

使用方法

使用《rotate-backups》包有两种方式:作为命令行程序rotate-backups和作为Python API。有关Python API的详细信息,请参阅Read the Docs上的API文档。下面将描述命令行界面。

命令行

用法: rotate-backups [OPTIONS] [DIRECTORY, ..]

基于同名Python包的简单备份轮换。

要使用此程序,您需要通过(组合)--hourly--daily--weekly--monthly和/或--yearly选项指定轮换方案,并将包含要轮换备份的目录(或多个目录)作为一个或多个位置参数。

您可以通过在DIRECTORY前加上SSH别名,并用冒号与DIRECTORY分开(类似于rsync接受远程位置的方式)在远程系统上通过SSH轮换备份。

除了在命令行上指定目录和轮换方案外,您还可以将它们添加到配置文件中。有关详细信息,请参阅在线文档(也请参阅--config选项)。

请使用 --dry-run 选项在程序开始对您的宝贵备份进行操作之前,先测试指定轮换方案的效果!如果您不使用试运行模式测试结果,而程序消耗了超出预期的更多备份,您无权抱怨;-)。

支持选项

选项

描述

-M, --minutely=COUNT

字面上,此选项设置在轮换期间保留的“每分钟备份”数量。对于大多数用例,这并没有太多意义:-),但您可以组合 --minutely--relaxed 选项,以保留每小时不止一个备份。有关 COUNT 的详细信息,请参阅 -H, --hourly 选项的使用。

-H, --hourly=COUNT

设置在轮换期间保留的小时备份数量

  • 如果 COUNT 是一个数字,则表示从最近的每小时备份开始,按时间顺序保留的小时备份数量。

  • 或者,您可以提供一个表达式,该表达式将被评估以获取一个数字(例如,如果 COUNT 是“7 * 2”,则结果将是 14)。

  • 您还可以将“always”传递给 COUNT,在这种情况下,所有小时备份都将保留。

  • 默认情况下,不保留任何小时备份。

-d, --daily=COUNT

设置在轮换期间保留的每日备份数量。有关 COUNT 的详细信息,请参阅 -H, --hourly 选项的使用。

-w, --weekly=COUNT

设置在轮换期间保留的每周备份数量。有关 COUNT 的详细信息,请参阅 -H, --hourly 选项的使用。

-m, --monthly=COUNT

设置在轮换期间保留的每月备份数量。有关 COUNT 的详细信息,请参阅 -H, --hourly 选项的使用。

-y, --yearly=COUNT

设置在轮换期间保留的每年备份数量。有关 COUNT 的详细信息,请参阅 -H, --hourly 选项的使用。

-t, --timestamp-pattern=PATTERN

自定义用于匹配和从文件名中提取时间戳的正则表达式模式。 PATTERN 应该是一个与 Python 兼容的正则表达式,它必须定义名为捕获组 'year'、'month' 和 'day',并且可以定义 'hour'、'minute' 和 'second'。

-I, --include=PATTERN

仅处理与 PATTERN 给定的 shell 模式匹配的备份。此参数可以重复。请确保引用 PATTERN,以确保在传递给 rotate-backups 之前,shell 不会扩展模式。

-x, --exclude=PATTERN

不要处理与PATTERN给定的shell模式匹配的备份。此参数可重复使用。请确保引用PATTERN,以免shell在rotate-backups收到模式之前将其展开。

-j--parallel

并行删除备份,每次一个挂载点。这种方法的原理是,当要删除的文件位于不同的磁盘上时,并行旋转最为有用,可以同时利用多个设备。

因为挂载点是针对每个系统设置的,所以-j--parallel选项也会并行化处理位于多个远程系统上的备份。

-p--prefer-recent

默认情况下,每个时间段内保留第一个(最老的)备份。如果您想保留每个时间段内最新的备份,则此选项适用于您。

-r--relaxed

默认情况下,每个旋转方案的时间窗口都得到强制执行(这被称为严格旋转),但可以使用-r--relaxed选项来更改此行为。以下示例说明了严格旋转和宽松旋转之间的区别:

  • 当使用严格旋转且要保留的小时备份数量为三个时,只有创建在相关时间窗口内的备份(最近备份的小时以及之前的两个小时)将与每小时频率匹配。

  • 当使用宽松旋转时,最近的三次备份都将匹配每小时频率(因此将被保留),无论计算出的时间窗口如何。

如果上述解释不够清楚,这里有一个简单的方法来决定您是否要自定义此行为:

  • 如果您的备份以规律的时间间隔创建,并且您从未错过任何一个间隔,那么严格旋转(默认选项)可能是最佳选择。

  • 如果您的备份以不规则的时间间隔创建,则您可能需要使用-r--relaxed选项来保留更多备份。

-i--ionice=CLASS

使用“ionice”程序设置用于删除备份的“rm”调用所使用的I/O调度类和优先级。CLASS预计是以下值之一:“idle”(3)、“best-effort”(2)或“realtime”(1)。有关这些值的详细信息,请参阅“ionice”程序的man页面。需要使用数字值,这是“busybox”实现“ionice”的要求。

-c--config=FILENAME

FILENAME加载配置。如果没有指定此选项,将搜索以下默认位置以查找配置文件:

  • /etc/rotate-backups.ini和/etc/rotate-backups.d/*.ini

  • ~/.rotate-backups.ini和~/.rotate-backups.d/*.ini

  • ~/.config/rotate-backups.ini和~/.config/rotate-backups.d/*.ini

以上顺序加载任何可用的配置文件,因此用户特定配置文件中的部分将覆盖系统范围内配置文件中同名部分。有关更多详细信息,请参阅在线文档。

-C--removal-command=CMD

更改用于删除备份的命令。变量CMD的默认值是rm ``-f``R。这个选择是因为无论“要轮换的备份”是文件、目录或两者的混合,它都能正常工作。

以更改此命令的示例,CephFS快照表示为常规目录树,可以一次性使用单个‘rmdir’命令删除(尽管根据POSIX语义,这个命令应该拒绝删除非空目录,但我不展开了)。

-u, --use-sudo

启用使用“sudo”在当前用户(或通过SSH登录到远程系统的用户)不可读和/或可写目录中轮换备份。

-S, --syslog=CHOICE

显式启用或禁用系统日志,而不是让程序自行决定。值‘1’、‘yes’、‘true’和‘on’启用系统日志,而值‘0’、‘no’、‘false’和‘off’禁用系统日志。

-f, --force

如果理智检查失败,则会报告错误并终止程序。您可以使用--force继续进行备份轮换。理智检查是为了确保指定的目录存在,可读且可写。如果提供了--removal-command选项,则跳过最后的理智检查(因为自定义删除命令意味着自定义语义)。

-n, --dry-run

不进行任何更改,只打印将要执行的操作。这使得在不会丢失任何备份的情况下评估轮换方案的影响变得容易。

-v, --verbose

增加日志详细程度(可重复)。

-q, --quiet

减少日志详细程度(可重复)。

-h, --help

显示此信息并退出。

配置文件

您还可以在配置文件中添加目录和轮换方案,而不仅仅是通过命令行指定。

配置文件是Python的configparser模块支持的ini语法子集的文本文件。它们可以位于以下位置

目录

主要配置文件

模块化配置文件

/etc

/etc/rotate-backups.ini

/etc/rotate-backups.d/*.ini

~

~/.rotate-backups.ini

~/.rotate-backups.d/*.ini

~/.config

~/.config/rotate-backups.ini

~/.config/rotate-backups.d/*.ini

上述顺序加载可用的配置文件,以便用户特定的配置文件覆盖全局配置文件。

您可以使用命令行选项--config以非标准位置加载配置文件,在这种情况下,上述提到的默认位置被忽略。

配置文件中的每个部分定义了一个包含要轮换备份的目录。每个部分中的选项定义了轮换方案和其他选项。以下是一个基于我如何使用rotate-backups轮换我定期备份的Linux安装的备份的示例

# /etc/rotate-backups.ini:
# Configuration file for the rotate-backups program that specifies
# directories containing backups to be rotated according to specific
# rotation schemes.

[/backups/laptop]
hourly = 24
daily = 7
weekly = 4
monthly = 12
yearly = always
ionice = idle

[/backups/server]
daily = 7 * 2
weekly = 4 * 2
monthly = 12 * 4
yearly = always
ionice = idle

[/backups/mopidy]
daily = 7
weekly = 4
monthly = 2
ionice = idle

[/backups/xbmc]
daily = 7
weekly = 4
monthly = 2
ionice = idle

如上例中所示,在/backups/server目录的保留期间,您可以使用表示数字的表达式(而不是必须写出数字)。

以下是一个配置两个远程目录的示例

# SSH as a regular user and use `sudo' to elevate privileges.
[server:/backups/laptop]
use-sudo = yes
hourly = 24
daily = 7
weekly = 4
monthly = 12
yearly = always
ionice = idle

# SSH as the root user (avoids sudo passwords).
[server:/backups/server]
ssh-user = root
hourly = 24
daily = 7
weekly = 4
monthly = 12
yearly = always
ionice = idle

如本例所示,您可以选择以root用户身份连接,或者以普通用户身份连接并使用 sudo 来提升权限。

自定义轮换算法

自从发布 rotate-backups 以来,我发现默认的轮转算法并不满足所有人的需求,因为建议的替代方案与最初的选择一样有效,所以添加了选项来公开替代行为

默认

替代

严格轮转(强制执行每个轮转频率的时间窗口)。

宽松轮转(不强制执行时间窗口)。通过 -r--relaxed 选项启用。

保留每个时间窗口中最旧的备份,并删除该时间窗口中的较新备份。

保留每个时间窗口中最新的备份,并删除该时间窗口中的较旧备份。通过 -p--prefer-recent 选项启用。

支持的配置选项

  • 使用 minutelyhourlydailyweeklymonthlyyearly 选项定义轮转方案,这些选项支持与命令行界面中记录的相同值。

  • timestamp-pattern 选项可用于自定义用于从文件名中提取时间戳的正则表达式。该值应是一个与Python兼容的正则表达式,必须包含名为‘year’、‘month’和‘day’的命名捕获组,并且可以包含‘hour’、‘minute’和‘second’组。以下是一个示例默认正则表达式

    # Required components.
    (?P<year>\d{4} ) \D?
    (?P<month>\d{2}) \D?
    (?P<day>\d{2}  ) \D?
    (?:
        # Optional components.
        (?P<hour>\d{2}  ) \D?
        (?P<minute>\d{2}) \D?
        (?P<second>\d{2})?
    )?

    注意这个模式跨越了多行:正则表达式使用 re.VERBOSE 标志编译,这意味着空白(包括换行符)将被忽略。

  • include-listexclude-list 选项定义了要包含或分别排除的文件名模式的逗号分隔列表

    • 请确保不要在配置文件中引用模式,只需直接提供即可。

    • 如果配置文件中定义了包含或排除列表,则它将覆盖命令行中提供的包含或排除列表。

  • prefer-recentstrictuse-sudo 选项期望一个布尔值(yesnotruefalse10)。

  • removal-command 选项可用于自定义用于删除备份的命令。

  • ionice 选项期望一个I/O调度类名称(idlebest-effortrealtime(或相应的数字))。

  • ssh-user 选项可用于覆盖用于连接远程系统的远程SSH账户名称。

它是如何工作的

rotate-backups 的基本前提相当简单

  1. rotate-backups 指向包含带时间戳备份的目录。

  2. 它将扫描目录中的条目(无论是文件还是目录),这些条目具有在名称中可识别的时间戳。

  3. 应用用户定义的轮换方案到条目。如果这不符合您的预期,您可以尝试使用 --relaxed 和/或 --prefer-recent 选项。

  4. 要轮换的条目将被删除(或在模拟运行中打印)。

联系方式

rotate-backups 的最新版本可在 PyPIGitHub 上找到。文档托管在 Read the Docs 上,包括一个 变更日志。对于错误报告,请在 GitHub 上创建问题。如果您有任何问题或建议,请随时通过 peter@peterodding.com 发送电子邮件给我。

许可证

本软件采用 MIT 许可证

© 2020 Peter Odding。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪一个,请了解有关 安装软件包 的更多信息。

源分布

rotate-backups-8.1.tar.gz (47.8 kB 查看哈希值)

上传时间

构建分布

rotate_backups-8.1-py2.py3-none-any.whl (30.9 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面