> ## Content Index
> Fetch the complete content index at: https://blog.lange-it.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Docker | Datenbank Backups
- URL: https://blog.lange-it.com/docker-datenbank-backups/
- Published: 2025-10-06T17:32:06.000Z
- Updated: 2025-10-06T17:32:06.000Z
- Author: Peter Lange
- Tags: Docker, Backups

Um **von deinem Docker Host aus** einen **MariaDB-Dump** eines **Containers** zu erstellen, gibt es mehrere Wege – je nachdem, ob du direkt `mysqldump` im Container ausführen möchtest oder über den Host auf die Datenbank zugreifst.  
Hier die gängigsten Methoden:

## 🧩 Variante 1: Dump über `docker exec` (empfohlen)

Du führst `mysqldump` **im Container** aus, aber der Befehl läuft **vom Host aus**.

### Beispiel:

```bash
docker exec -i <container_name_or_id> \
  mysqldump -u<db_user> -p<db_password> <database_name> > dump.sql

```

Beispiel mit echten Werten:

```bash
docker exec -i mariadb-container \
  mysqldump -uroot -psecret mydatabase > /home/user/dumps/mydatabase.sql

```

💡 **Hinweis:**

- Es darf **kein Leerzeichen** zwischen `-p` und dem Passwort stehen.
- Der Dump wird **auf dem Host** in die Datei `dump.sql` geschrieben.
- Der Befehl `mysqldump` muss im Container installiert sein (bei offiziellen MariaDB-Images ist das standardmäßig so).

---

## 🧰 Variante 2: Dump direkt auf dem Host, wenn Port exposed ist

Wenn dein Container z. B. den Port `3306` nach außen mapped (`-p 3306:3306`), kannst du dich **vom Host direkt verbinden**:

```bash
mysqldump -h 127.0.0.1 -P 3306 -u<db_user> -p<db_password> <database_name> > dump.sql

```

✅ Vorteil: Kein `docker exec` nötig.  
⚠️ Nachteil: Funktioniert nur, wenn der Port freigegeben ist und Verbindungen erlaubt sind.

---

## 🪣 Variante 3: Dump innerhalb des Containers und Datei herauskopieren

Wenn du lieber **im Container selbst** dumpst und dann die Datei auf den Host kopierst:

```bash
docker exec mariadb-container \
  sh -c 'mysqldump -uroot -psecret mydatabase > /tmp/mydump.sql'

```

Dann:

```bash
docker cp mariadb-container:/tmp/mydump.sql ./mydump.sql

```

und optional:

```bash
docker exec mariadb-container rm /tmp/mydump.sql

```

---

## 🧼 Optionale Kompression

Um den Dump gleich zu komprimieren:

```bash
docker exec -i mariadb-container \
  mysqldump -uroot -psecret mydatabase | gzip > mydatabase.sql.gz

```

---

Hier ist ein robustes **Bash-Skript**, das du **vom Docker-Host aus** laufen lassen kannst, um automatisch Dumps aus einem **MariaDB-Container** zu erstellen — mit Datum, Kompression und optionaler Rotation.

```bash
#!/bin/bash
#
# MariaDB Docker Dump Script
# ---------------------------
# Erstellt automatisiert einen Dump aus einem MariaDB-Docker-Container
# und speichert ihn komprimiert auf dem Host.
#
# Autor: Peter Lange // Lange-IT.com
# Datum: 2025-09-22
#

### === Konfiguration ===
CONTAINER_NAME="mariadb-container"     # Name oder ID deines MariaDB-Containers
DB_USER="root"                         # Datenbankbenutzer
DB_PASS="secret"                       # Passwort (ohne Leerzeichen nach -p!)
DB_NAME="mydatabase"                   # Datenbankname, oder --all-databases
BACKUP_DIR="/var/backups/mariadb"      # Lokales Backup-Verzeichnis
DATE=$(date +"%Y-%m-%d_%H-%M")
FILE_NAME="${DB_NAME}_${DATE}.sql.gz"  # Dump-Dateiname
KEEP_DAYS=7                            # Anzahl der Tage, alte Backups zu behalten

### === Sicherstellen, dass Backup-Verzeichnis existiert ===
mkdir -p "$BACKUP_DIR"

### === Dump erstellen ===
echo "📦 Erstelle Dump von '${DB_NAME}' aus Container '${CONTAINER_NAME}'..."

docker exec -i "$CONTAINER_NAME" \
  mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "${BACKUP_DIR}/${FILE_NAME}"

if [ $? -eq 0 ]; then
  echo "✅ Dump erfolgreich erstellt: ${BACKUP_DIR}/${FILE_NAME}"
else
  echo "❌ Fehler beim Dump-Erstellen!" >&2
  exit 1
fi

### === Alte Backups löschen ===
echo "🧹 Entferne Backups, die älter als ${KEEP_DAYS} Tage sind..."
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +$KEEP_DAYS -exec rm -f {} \;

echo "🏁 Backup abgeschlossen."

```

## 🔧 Nutzung

1. Speichern:

```bash
sudo nano /usr/local/bin/mariadb-dump.sh

```

1. Ausführbar machen:

```bash
sudo chmod +x /usr/local/bin/mariadb-dump.sh

```

1. Manuell testen:

```bash
/usr/local/bin/mariadb-dump.sh

```

1. (Optional) Cronjob einrichten – z. B. täglich um 2 Uhr:

```bash
crontab -e
```

```bash
0 2 * * * /usr/local/bin/mariadb-dump.sh >> /var/log/mariadb-backup.log 2>&1

```

---

## ⚙️ Optionen

- Wenn du **alle Datenbanken** sichern willst, ändere:

```bash
DB_NAME="--all-databases"
FILE_NAME="all_databases_${DATE}.sql.gz"

```

Viel Erfolg - Kein Backup? Kein Mitleid! 😄