Forum: PC Hard- und Software BASH -> MySQLDump -> Nur x Dateien aufbehalten


von SSHod (Gast)


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

von Jim M. (turboj)


Lesenswert?

Den "docker exec" Aufruf da drin hattest Du gesehen? Das funzt 
logischerweise nur in einer Docker Umgebung.

von SSHod (Gast)


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"

von quotendepp (Gast)


Lesenswert?

hast du logrotate zur verfügung? das kann das problem "nur x dateien 
aufbewahren" von haus aus, einen sql-dump kann man in einem der hooks 
(weiß leider nicht mehr welcher das war) machen.

von Internatszögling (Gast)


Lesenswert?

user hoden
Auch nicht schlecht

Du musst innerhalb der Schleife auch löschen, deshalb wird das nie 
weniger.

von Internatszögling (Gast)


Lesenswert?

.. habe das
1
xargs rm -f
übersehen.

von Internatszögling (Gast)


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

von Internatszögling (Gast)


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.

von Ant Wort (Gast)


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)

von Jens G. (jensig)


Lesenswert?

Der Backupdateiname ist mal so, mal so. Will heißen, mal mit 
Bindestrich, mal mit Unterstrich ...

von Internatszögling (Gast)


Lesenswert?

Jens G. schrieb:
> Der Backupdateiname ist mal so, mal so. Will heißen, mal mit
> Bindestrich, mal mit Unterstrich ...

Da sieht man wie man selbst mit (m)einem Testscript auf die Schnauze 
fallen kann.

von Philipp K. (philipp_k59)


Lesenswert?

ohne Gewähr, löscht alles älter 30 Tage..

find ./volume1/Backups/ -type f -regex 'mariaDBDump[_\-].*\.gz'  -mtime 
+30 -exec rm {} \;

von MaWin (Gast)


Lesenswert?

Aber der TO ist eine Null, darum fragt es hier

von Ich (Gast)


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

von Daniel A. (daniel-a)


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...

: Bearbeitet durch User
von bashooka (Gast)


Lesenswert?

Wenn das dir leer ist hat man manchemal auch hässliche Effekte ohne
gesetztes shopts -s extglob

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.