[Docker-Compose] MySQL/MariaDB jede Datenbank in eine eigene Datei exportieren

Artikel des Jahres

Hey,

heute ein bisschen Code.

fire - kill0rz.com

Man stelle sich vor, eine Datenbank läuft über docker-compose in einem Container:

fire - kill0rz.com
db:
image: mariadb
  volumes:
    - './data/mysql/data/:/var/lib/mysql'
    - './data/mysql/backups/:/opt/backups/'

Aufgabe: Sichere über einen Cronjob jede Datenbank in eine eigene .sql-Datei.

Das hat mich echt Nerven gekostet!

Über folgendes Snippet geht es aus dem Terminal heraus:

/usr/local/bin/docker-compose exec -db mysql -uroot -pMEINPASSWORT -N -e 'show databases'  | tr "|+-" " "  | grep -v -e '^[[:space:]]*$' | while read dbname; do dbnametrim=$(echo "$dbname" | tr -d '[:space:]'); if test ! -z "$dbnametrim"; then /usr/local/bin/docker-compose exec -d db mysqldump -uroot -pMEINPASSWORT --complete-insert "$dbnametrim" --result-file="/opt/backups/$dbnametrim.sql"; fi ; done

Was passiert hier? Getrennt nach Pipes die einzelnen Aufgaben der Befehle:

  • alle Datenbanken auflisten
  • Alle Pipes, Plusses und und Minusse entfernen, weil die DB-Namen in einer Tabellenstruktur ausgegeben werden
  • Leere Zeilen entfernen
  • Für jede Zeile: Führende und nachhängende Leerzeichen und Zeilenumbrüche entfernen und in Variable zwischenspeichern.
  • Wenn ein DB-Name gesetzt ist, Export an den Container übergeben

Der innere compose-Befehl bekommt ein -d mit, damit er im Hintergrund ausgeführt wird und der Output nicht die while-Schleife durchbricht.
In einem Cronjob wird das aber nicht funktionieren. Dafür braucht der äußere compose-Befehl noch den -T Parameter, da wir im Cron kein interaktives Terminal haben.
Den Spaß noch in ein Bash-Script gewrappt und los:

#!/bin/bash

rm ./data/mysql/backups/*

/usr/local/bin/docker-compose exec -T db mysql -uroot -pMEINPASSWORT -N -e 'show databases'  | tr "|+-" " "  | grep -v -e '^[[:space:]]*$' | while read dbname; do dbnametrim=$(echo "$dbname" | tr -d '[:space:]'); if test ! -z "$dbnametrim"; then /usr/local/bin/docker-compose exec -d db mysqldump -uroot -pMEINPASSWORT --complete-insert "$dbnametrim" --result-file="/opt/backups/$dbnametrim.sql"; fi ; done

kill0rz

This entry was posted in Allgemein, Artikel des Jahres, Betriebssysteme, Internet, Linux, self-coded, Server, Tutorials. Bookmark the permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Bitte löse die Rechnung! * Time limit is exhausted. Please reload CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.