Jak smazat staré zálohy za pomoci utility retention policy

Jak smazat staré zálohy za pomoci utility retention policy

Mám v zálohách haldu dumpů databáze a chci je automaticky promazávat dle času. Chci zachovat:

  • 7x denní zálohu
  • 5x týdenní zálohu
  • 12x měsíční
  • 1x roční

Začnu tím, že si vypíšu adresáře, kterých se to týká. Pomocí roury (angl. pipe) předám na vstup utility ret-policy, které předám argumenty pro politiku (--keep-daily, --keep-weekly atd.).

V testovacím režimu si nechám vypsat (pomocí flagu -v), které adresáře se mají smazat nebo ponechat (--revert flag). Vzhledem k tomu, že názvy adresářů se zálohou mají výchozí formát (--format), nemusím žádný specifikovat.

Něco jako:

find /backup/fisher-of-men/postgresql/10/main/ -type d -not -wholename /backup/fisher-of-men/postgresql/10/main/ | ret-policy --keep-weekly=5 --keep-daily=7 --keep-monthly=12 --keep-yearly=1 -vvv

Příkaz mi vypíše:

INFO: keep /backup/fisher-of-men/postgresql/10/main/20230212010001 because it matches policy: 'daily', n: 1
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230211010001 because it matches policy: 'daily', n: 2
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230210010001 because it matches policy: 'daily', n: 3
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230209010002 because it matches policy: 'daily', n: 4
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230208010001 because it matches policy: 'daily', n: 5
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230207010001 because it matches policy: 'daily', n: 6
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230206010001 because it matches policy: 'daily', n: 7
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230205010001 because it matches policy: 'weekly', n: 1
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230129010001 because it matches policy: 'weekly', n: 2
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230122010001 because it matches policy: 'weekly', n: 3
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230115010001 because it matches policy: 'weekly', n: 4
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230108010001 because it matches policy: 'weekly', n: 5
INFO: keep /backup/fisher-of-men/postgresql/10/main/20230131010001 because it matches policy: 'monthly', n: 1
INFO: keep /backup/fisher-of-men/postgresql/10/main/20221231010001 because it matches policy: 'monthly', n: 2
INFO: keep /backup/fisher-of-men/postgresql/10/main/20221130010001 because it matches policy: 'monthly', n: 3
INFO: keep /backup/fisher-of-men/postgresql/10/main/20221031010001 because it matches policy: 'monthly', n: 4
INFO: keep /backup/fisher-of-men/postgresql/10/main/20220930010001 because it matches policy: 'monthly', n: 5
INFO: keep /backup/fisher-of-men/postgresql/10/main/20220831010001 because it matches policy: 'monthly', n: 6
INFO: keep /backup/fisher-of-men/postgresql/10/main/20220731010001 because it matches policy: 'monthly', n: 7
INFO: Timestamps to delete:
/backup/fisher-of-men/postgresql/10/main/20230101010001
/backup/fisher-of-men/postgresql/10/main/20230102010001
/backup/fisher-of-men/postgresql/10/main/20230103010001
/backup/fisher-of-men/postgresql/10/main/20230104010002
/backup/fisher-of-men/postgresql/10/main/20230105010001
/backup/fisher-of-men/postgresql/10/main/20230106010001
/backup/fisher-of-men/postgresql/10/main/20230107010001
/backup/fisher-of-men/postgresql/10/main/20230109010001
/backup/fisher-of-men/postgresql/10/main/20230110010001
/backup/fisher-of-men/postgresql/10/main/20230111010001
/backup/fisher-of-men/postgresql/10/main/20230112010001
/backup/fisher-of-men/postgresql/10/main/20230113010001
/backup/fisher-of-men/postgresql/10/main/20230114010001
/backup/fisher-of-men/postgresql/10/main/20230116010001
/backup/fisher-of-men/postgresql/10/main/20230117010001
/backup/fisher-of-men/postgresql/10/main/20230118010001
/backup/fisher-of-men/postgresql/10/main/20230119010001
/backup/fisher-of-men/postgresql/10/main/20230120010001
/backup/fisher-of-men/postgresql/10/main/20230121010001
/backup/fisher-of-men/postgresql/10/main/20230123010001
/backup/fisher-of-men/postgresql/10/main/20230124010001
/backup/fisher-of-men/postgresql/10/main/20230125010001
/backup/fisher-of-men/postgresql/10/main/20230126010001
/backup/fisher-of-men/postgresql/10/main/20230127010001
/backup/fisher-of-men/postgresql/10/main/20230128010001
/backup/fisher-of-men/postgresql/10/main/20230201010001
/backup/fisher-of-men/postgresql/10/main/20230202010002
/backup/fisher-of-men/postgresql/10/main/20230203010001
/backup/fisher-of-men/postgresql/10/main/20230204010001

Pokud vše funguje jak bych očekával, výstup zase pomocí roury předám utilitě xargs, která vykoná příkaz rm -r <adresar>.

Celý skript pak budu volat cronem jednou za den.

#!/bin/bash

set -e
find /backup/fisher-of-men/postgresql/10/main/ -type d -not -wholename /backup/fisher-of-men/postgresql/10/main/ | ret-policy --keep-weekly=5 --keep-daily=7 --keep-monthly=12 --keep-yearly=1 | xargs --no-run-if-empty rm -r
MAILTO=root

5 4 * * * root /backup/_bin/fisher-of-men/remove-old-postgresql-dumps.sh

Zdroje

  • man ret-policy
  • man find