@ibims Sorry für die späte Antwort, hier ist was sich für mich bewährt hat:
mariadb-dump -C --single-transaction -f --opt --routines -u"${MYSQL_USER}" -p"{$MYSQL_PASSWORD}" "${MYSQL_DATABASE}" | gzip > "${MYSQL_DATABASE}-$(date -I).sql.gz"
Kurz zur Erläuterung der Optionen, Kommandos und deren Zwecke:
-
--compress / -C Komprimiert die Daten zwischen MariaDB-Server und diesem Client (mit zlib). Selbst wenn beides auf demselben Host läuft, beschleunigt es das Backup weil CPU-Zeit heute in der Regel immer noch in grösserem Überfluss als Netzwerk und Memory und Disk-I/O-Bandbreite ist.
-
--single-transaction Damit die Daten konsistent sind, willst Du alles in einer Transaktion einfangen. Downside: Das blockiert alle schreibenden Datenbank-Zugriffe während des Backups. Falls Du einen scale-out-cluster hast, kannst Du das Backup natürlich auf einer der Read-only-Replikas machen, ohne Impact auf die Applikation.
-
--force / -f Weitermachen, auch wenn Fehler auftreten. Z.B. könnte eine Tabelle beschädigt sein und ein REPAIR nötig haben, aber die restlichen Tabellen sollen trotzdem noch gesichert werden.
-
--opt "This option is shorthand. [...] Enabled by default, [...]. It should give you a fast dump operation and produce a dump file that can be reloaded into a MariaDB server quickly." -- Quelle
-
--routines Für den Fall, dass Deine DB Stored Procedures und Funktionen enthält. Bei typischen Web-Apps eher selten, aber falls vorhanden, willst Du die auch sichern.
-
gzip Komprimiert SQL Text-Datei mit dem in CPU-Zeit "billigen" zlib-Algorithmus. Falls Du knapp an Speicher bist und genug CPU- und Zeit-Budget fürs Backup hast, kannst Du natürlich auf xz oder zstd oder was anderes wechseln, was eine bessere Kompressionsrate gegen CPU-Zeit tauscht.
Falls Du eine grosse MariaDB-Instanz mit vielen Datenbanken hast, kannst Du auch die DBs listen und Dir Kommandos pro DB generieren lassen (das lockt dann auch nur eine DB um die andere):
mariadb --batch --skip-column-names --execute="SHOW DATABASES" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" |
grep -v 'information_schema\|performance_schema\|lost+found\|mysql' |
awk '{ print cmd, $1 " | gzip > " $1 date ".sql.gz" }' cmd='mariadb-dump -C --single-transaction -f --opt --routines -u"${MYSQL_USER}" -p"{$MYSQL_PASSWORD}"' date="-$(date -I)" |
shUnd last but not least, um ein so erstelltes Backup wiederherzustellen, pipest Du die SQL-Kommandos zurück in mariadb:
zcat "${MYSQL_DATABASE}-2026-02-22.sql.gz" | mariadb -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" "${MYSQL_DATABASE}"