BASH -> MySQLDump -> Nur x Dateien aufbehalten

Gast #6821442
Lesenswert?

Hallo Leute,

Leider funktioniert mein Bash Script (Aus einem Forum GEKLAUT) nicht so 
wie es soll.
Es sollte ja die XXX gegeben Versionen behalten und die älteren löschen.
ABER, es sind nun schon einige hunderte (grösser die angegebenen) 
Sicherungen vorhanden, ohne das die Älteren gelöscht werden.

Noch zu erwähnen ist, das ich Linuxtechnisch ein DAO bin und das Ding 
"out of the box" auf einem NAS funktionieren soll.

Wo liegt hier der Fehler begraben?
1
#!/bin/bash
2
#
3
# dieses Skript kann man beliebig oft ausführen
4
#
5
# Anzahl der Sicherungen die aufgehoben werden sollen
6
KEEP=270
7
BACKUPS=`find /volume1/Backups/ -name "MariaDBDump-*.gz" | wc -l | sed 's/\ //g'`
8
while [ $BACKUPS -ge $KEEP ]
9
do
10
ls -tr1 /volume1/Backups/MariaDBDump-*.gz | head -n 1 | xargs rm -f 
11
BACKUPS=`expr $BACKUPS - 1` 
12
done
13
DATE=`date +%Y_%m_%d__%H_%M`
14
rm -f /volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS
15
docker exec mariadb mysqldump --opt -uhoden -p08150815 --all-databases | gzip -c -9 > /volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS
16
mv -f /volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS /volume1/Backups/MariaDBDump_${DATE}.gz
17
exit 0
Gast #6821708
Lesenswert?

Was hat das mit dem Docker am Hut?
Wird doch eigens abgearbeitet und schaufelt die Daten in ein .inProgress 
Datei, welche anschliessend komprimiert wird.
Leider verstehe ich das vorderbei nicht.
Das "behalte XXX Dateien und lösche den Rest"
Gast #6821870
Lesenswert?

Also ohne Docker funktioniert es einwandfrei.

Testfiles generieren: generateFiles.sh
1
!/bin/bash
2
if [ ! -d ./volume1 ];
3
then
4
 mkdir -p ./volume1/Backups
5
fi
6

7
for i in {1..20}
8
do
9
 touch ./volume1/Backups/MariaDBDump-2021-09-${i}__01_00.gz
10
done

Testscript ohne docker KeepNfiles.sh:
1
#!/bin/bash
2

3
KEEP=10
4
BACKUPS=`find ./volume1/Backups/ -name "MariaDBDump-*.gz" | wc -l | sed 's/\ //g'`
5

6
while [ $BACKUPS -ge $KEEP ]
7
do
8
 ls -tr1 ./volume1/Backups/MariaDBDump-*.gz | head -n 1 | xargs rm -f
9
 BACKUPS=`expr $BACKUPS - 1` 
10
done
11
DATE=`date +%Y_%m_%d__%H_%M`
12
rm -f ./volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS
13

14
 echo "blaaaaaaaaaaaaaaaaaaaaa" | gzip -c -9 > ./volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS
15

16
mv -f ./volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS ./volume1/Backups/MariaDBDump_${DATE}.gz
17

18
exit 0
Gast #6821893
Lesenswert?

Mit
1
docker exec mariadb mysqldump --opt -uhoden -p08150815 --all-databases | gzip -c -9 > /volume1/Backups/.MariaDBDump_${DATE}.gz_INPROGRESS
Greifst du ab dem "> /volume1" von docker aus auf was zu was ausserhalb 
der dockerumgebung liegt zu das geht so nicht.

Entweder das volume1 innerhalb docker bereitstellen (dir via 
smb-share,... ) oder innerhalb der Dockerumgebung die backups ablegen.
Gast #6821948
Lesenswert?

Na gut, dass das nicht maximal kompliziert ist...

Das Löschen der Dateien bis auf die Letzten X würde ich so machen:
ls -1 ./volume1/Backups/MariaDBDump-*.gz | head -n -20 | xargs echo "rm 
-f "
(Ggf muss es ls -t1 heißen)
Gast #6822723
Lesenswert?

Auch im Originalscript des TO sind Bindestrich und Unterstrich gemischt!

Das Backup erzeugt
1
MariaDBDump_${DATE}.gz

Der "ältere löschen" Teil sucht aber nach
1
find /volume1/Backups/ -name "MariaDBDump-*.gz"
 ...

Der müsste korrekt heißen:
1
BACKUPS=`find /volume1/Backups/ -name "MariaDBDump_*.gz" | wc -l | sed 's/\ //g'`
2

3
while [ $BACKUPS -ge $KEEP ]
4

5
do
6

7
ls -tr1 /volume1/Backups/MariaDBDump_*.gz | head -n 1 | xargs rm -f 
8

9
BACKUPS=`expr $BACKUPS - 1` 
10

11
done
#6823060
Lesenswert?

Ant Wort schrieb:
> Na gut, dass das nicht maximal kompliziert ist...
>
> Das Löschen der Dateien bis auf die Letzten X würde ich so machen:
> ls -1 ./volume1/Backups/MariaDBDump-*.gz | head -n -20 | xargs echo "rm
> -f "
> (Ggf muss es ls -t1 heißen)

So ähnlich würde ich auch so machen. (Bei -1 müsste es alphanumerisch 
sortiert sein, sollte bei einem ISO Datum im Namen gehen. Ich würde also 
eher auf -1t setzen.)

Zu den den find Varianten ist noch zu beachten, dass die Rekursiv sind. 
Auf die Reihenfolge würde ich mich dort auch nicht verlassen. Und vieles 
von diesen "wc -l" Geschichten usw. könnte man sich sparen, wenn man 
einfach bash Arrays nehmen würde.

Wie wäre es mit noch einer Variante?
1
#!/bin/bash
2

3
keep=270
4
backups=( /volume1/Backups/MariaDBDump-*.gz )
5

6
if [ ${#backups[@]} -gt $keep ]
7
  then rm "${backups[@]:0:${#backups[@]}-$keep-1}"
8
fi

Edit: hatte einen off-by-one fehler drinn...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren