Cleanup¶
In order to get rid of old backup versions, backy2 uses a garbage collection algorithm which is a 2-step process in backy2.
Remove old versions¶
In order to remove an old version, use backy2 rm
:
$ backy2 rm --help
usage: backy2 rm [-h] [-f] version_uid
positional arguments:
version_uid
optional arguments:
-h, --help show this help message and exit
-f, --force Force removal of version, even if it's younger than the
configured disallow_rm_when_younger_than_days.
Example:
$ backy2 rm 2453fe90-2f22-11e7-b961-a44e314f9270
INFO: $ /home/dk/develop/backy2/env/bin/backy2 rm 2453fe90-2f22-11e7-b961-a44e314f9270
INFO: Removed backup version 2453fe90-2f22-11e7-b961-a44e314f9270 with 25600 blocks.
INFO: Backy complete.
There is a config option called disallow_rm_when_younger_than_days
which
defaults to 6. If the to-be-removed backup version is younger than this value,
backy2 throws an error and exits with code 100:
backy2 rm 2453fe90-2f22-11e7-b961-a44e314f9270
INFO: $ /home/dk/develop/backy2/env/bin/backy2 rm 2453fe90-2f22-11e7-b961-a44e314f9270
ERROR: Unexpected exception
ERROR: 'Version 2453fe90-2f22-11e7-b961-a44e314f9270 is too young. Will not delete.'
…
backy2.backy.LockError: 'Version 2453fe90-2f22-11e7-b961-a44e314f9270 is too young. Will not delete.'
INFO: Backy failed.
$ echo $?
100
Of course you can --force
backy2 to delete this version:
$ backy2 rm 2453fe90-2f22-11e7-b961-a44e314f9270 --force
INFO: $ /home/dk/develop/backy2/env/bin/backy2 rm 2453fe90-2f22-11e7-b961-a44e314f9270 --force
INFO: Removed backup version 2453fe90-2f22-11e7-b961-a44e314f9270 with 25600 blocks.
INFO: Backy complete.
backy2 rm
removes version and corrosponding blocks from the metadata store.
It also adds the removed metadata entries into a delete-candidates - List.
In order to really delete blocks from the backup target, you’ll need backy2
cleanup
.
Using the expire feature¶
If you have added expiration to your versions as shown in the backup section, you can get the expired versions (based on you server time) via:
$ backy2 ls -e
Hint
If you want to remove versions automatically by scripting, you might use this:
$ for version in `backy2 -ms ls -e -f uid`; do backy2 rm $version; done
$ backy2 cleanup
backy2 cleanup¶
To free up space on the backup target, you need to cleanup. There are two different cleanup methods, but you’ll usually only need the so-called fast-cleanup.
$ backy2 cleanup --help
usage: backy2 cleanup [-h] [-f] [-p PREFIX] [--dangerous-force]
optional arguments:
-h, --help show this help message and exit
-f, --full Do a full cleanup. This will read the full metadata
from the data backend (i.e. backup storage) and
compare it to the metadata in the meta backend. Unused
data will then be deleted. This is a slow, but
complete process. A full cleanup must not be run
parallel to ANY other backy jobs.
-p PREFIX, --prefix PREFIX
If you perform a full cleanup, you may add --prefix to
only cleanup block uids starting with this prefix.
This is for iterative cleanups. Example: cleanup
--full --prefix=a
--dangerous-force Seriously, do not use this outside of testing and
development.
fast-cleanup¶
backy2 cleanup
will go through the list of delete-candidates and check if
there are blocks which are not referenced from any other version anymore.
These blocks are then deleted from the backup-target. The still-in-use blocks are removed from the list of delete-candidates.
In order to provide parallelism (i.e. multiple backy2 processes at the same time), backy2 needs to prevent race-conditions between adding a delete-candidate to the list and actually removing its data. That’s why a cleanup will only remove data blocks once they’re on the list of delete-candidates for more than 1 hour.
full-cleanup¶
There are times (e.g. when your database is corrupted or when you create a new database based on export/import) when backy2 does not know if the blocks in the backend storage are all known by the metadata store.
Then the -f
option of cleanup comes into play. With this option, backy2 will
read all block UIDs from the backend storage (which can take very long) and
compare it to the list of known block UIDs in the metadata store.
Blocks unknown to the metadata store are then deleted from the backend storage.
Because this can be a very slow process, you can use the -p
option to
provide a prefix. The first 10 characters of block UIDs are hexadecimal numbers
and small letters (0-9, a-f).
So a typical cleanup process after a desaster looks like this:
$ backy2 cleanup -f -p 00
$ backy2 cleanup -f -p 01
…
$ backy2 cleanup -f -p fe
$ backy2 cleanup -f -p ff
Or even something like
$ for p in $(printf %02x'\n' `seq -f %1.f 0 255`); do backy2 cleanup -f -p $p; done