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