Hallo Server Admins, ich habe mir bei Hetzner so eine Storage Box geholt. Darauf möchte ich tägliche Backups meiner MariaDB Datenbank machen. Die Frage ist nur, wie am besten? Je mehr ich im Netz zu diesem Thema suche, um so verwirrter bin ich.

Daher meine Frage an das Fediverse: Wie ist das beste Vorgehen bzw. welche Lösungen sind für einen Anfänger bei diesem Thema zu empfehlen?

@admins #followerpower #askfedi #fragdasfediverse

@ibims @crossgolf_rebel @admins Womit arbeitest du, Linux?
@MichaelimOdenwald
Ja mit Ubuntu 24.04 LTS.
@ibims @MichaelimOdenwald Die storage box bietet unter vielen anderen Protokollen scp (ssh ohne shell login). Ich würde also einfach einen cronjob anlegen, welcher Dein Lieblings MariaDB dump zieht, komprimiert und per rsync oder scp dort hoch lädt. 3 Zeilen script oder so? Kann gerne meine Mariadb dump flags teilen, die sich bewährt haben, falls Dir das nützt.

@elrido

Kann gerne meine Mariadb dump flags teilen, die sich bewährt haben, falls Dir das nützt.


Das wäre super. 😀

@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)" | sh

Und 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}"

mariadb-dump | Server | MariaDB Documentation

Complete MariaDB backup and recovery guide. Complete resource for backup methods, mariabackup usage, scheduling, and restoration for production use.

@ibims Das was @elrido schreibt 👍🏻
@ibims Ich benutze https://sourceforge.net/projects/automysqlbackup/, es gibt davon auch einen aktuelleren Fork (https://github.com/sixhop/AutoMySQLBackup) aber zu dem kann ich nichts sagen.
AutoMySQLBackup

Download AutoMySQLBackup for free. Automatic MySQL Backup. AutoMySQLBackup with a basic configuration will create Daily, Weekly and Monthly backups of one or more of your MySQL databases from one or more of your MySQL servers. Other Features include: - Email notification of backups - Backup Compression and Encryption - Configurable backup rotation - Incremental database backups Time for a new maintainer..

SourceForge
@ibims Docker oder Native? Ich machs mit https://github.com/tiredofit/docker-db-backup funktioniert für mich super... Sicher die DB local und schub's ich dann mit borgmatic auf die Storagebox.
GitHub - tiredofit/docker-db-backup: Backup multiple database types on a scheduled basis with many customizable options

Backup multiple database types on a scheduled basis with many customizable options - tiredofit/docker-db-backup

GitHub
@ibims da bin ich raus mit best practices...

@ibims @admins

Ich verwende Restic und Borg für Backups, aber bei einer Datenbank hilft das glaube ich nicht.

@tux @ibims @admins ich nutze borg + borgmatic, letzteres hat eine integrierte Funktion für DB-Backups. Ich bin damit bisher extrem zufrieden.

Link zur Doku:
https://torsion.org/borgmatic/reference/configuration/data-sources/mysql/

borgmatic - MySQL

@ibims @admins um mal verschiedene andere Faktoren von "kommt drauf an" auszuklammern: bist du schon so weit, dass dein backup als Datei bei dir rumliegt? Weil ab da bist du nur noch ein scp (copy, aber mittels SSH) von deinem Ziel entfernt.

Oder brauchst du auch noch Tipps wie du dein backup erstellst?

@NobodysNightmare
Habe bis jetzt immer per mysqldump Backups erstellt und lokal gespeichert.

@ibims dann könnte deine backup strategie darin bestehen diese lokalen backups in die box zu kopieren:

scp my-backup.sql.gz [email protected]:my-backup.sql.gz

Dazu musst du den SSH key des lokalen Nutzers der den Upload durchführt in der Box hinterlegen.

In meinem Beispiel nutze ich einen subaccount in der storage Box, damit verschiedene Server ihre eigenen Sachen sichern können.

@ibims @admins Ich würde ein Shellscript schreiben, das erst einen Dump erstellt und den dann per Borg über SSH sichert. Sowas in der Art?
@gideonstar
Genau, sowas in der Art.
@ibims Ich schreib dir kurz 'ne DM.
@ibims Kann Friendica überhaupt Direktnachrichten empfangen? :D
@ibims
@admins ich würde einfach im Cronjob einen sqldump ziehen und per rclone in Richtung Hetzner schieben.

@ibims Ich kann dir gerne meine Backup Scripts mal zur Verfügung stellen - bzw. wollte ich schon länger ein public git repo machen draus, vllt guter Zeitpunkt

hab ein recht umfangreiches backup.sh script drum rum gebaut, das per .env Variable gesteuert wird und dazu habe ich 4 systemd services definiert (create, prune, compact & check).

ich mach ein mariadbbackup in ein temp-verzeichnis, dadurch ist nämlich das deduplizieren ansatzweise mögluch. per stream hatte ich am anfang direkt - war halt ohne temp-schritt (weniger platzbedarf im temp), dafür hat das depluzieren gar nix gebracht.

@ibims Ich empfehle mariabackup, um eine Kopie einer Datenbank zu erstellen und dann scp, um die Kopie auf einen externen Server zu übertragen.
@heluecht @ibims Das neuere mariadb-backup (ein Percona Xtrabackup fork) ist in der Tat sehr viel mächtiger als mariadb-dump und insbesondere bei grossen Instanzen mit mehr als 100 GiB Daten sehr empfehlenswert, da es z.B. full-table-locks minimiert und so die Zeit reduziert in der die Instanz nicht geschrieben oder gelesen werden kann. Ich kann das auch nur empfehlen, wenn man sich ein neues MariaDB-Backup einrichtet.
mariadb-backup Overview | Server | MariaDB Documentation

Complete MariaDB backup and recovery guide. Complete resource for backup methods, mariadb-backup usage, scheduling, and restoration for production use.