#!/bin/bash # ======== Funktion für Ausgaben ======== function echo_info() { echo -e "\e[32m[$(date +'%Y-%m-%d %H:%M:%S')] [INFO] $1\e[0m" echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [INFO] $1" >> "$LOG_FILE" } function echo_warning() { echo -e "\e[33m[$(date +'%Y-%m-%d %H:%M:%S')] [WARNUNG] $1\e[0m" echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [WARNUNG] $1" >> "$LOG_FILE" } function echo_error() { echo -e "\e[31m[$(date +'%Y-%m-%d %H:%M:%S')] [FEHLER] $1\e[0m" echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [FEHLER] $1" >> "$LOG_FILE" } function echo_success() { echo -e "\e[34m[$(date +'%Y-%m-%d %H:%M:%S')] [ERFOLG] $1\e[0m" echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] [ERFOLG] $1" >> "$LOG_FILE" } # ======== ASCII Art ======== cat << "EOF" __ __ ____ ___ _ ____ _ | \/ |_ _/ ___| / _ \| | | __ ) __ _ ___| | ___ _ _ __ | |\/| | | | \___ \| | | | | | _ \ / _\` |/ __| |/ / | | | '_ \ | | | | |_| |___) | |_| | |___ | |_) | (_| | (__| <| |_| | |_) | |_| |_|\__, |____/ \__\_\_____| |____/ \__,_|\___|_|\_\\__,_| .__/ |___/ |_| EOF # ======== Variablen ======== LOG_FILE="./mysql_dump.log" BACKUP_DIR="./MySQL-Backup/" FOUND_CONTAINERS=$(docker ps --format "{{.Names}}") CONTAINERS=$(docker ps --format "{{.Image}} {{.Names}}" | grep "^mysql" | awk '{print $2}') DATE=$(TZ=Europe/Berlin date +'%Y-%m-%d_%H-%M-%S') # ======== Backup Directory erstellen ======== echo_info "---------- Backup gestartet: $DATE ----------" # Überprüfen, ob das Backup-Verzeichnis existiert und ggf. erstellen if [ ! -d "$BACKUP_DIR" ]; then echo "Das Verzeichnis $BACKUP_DIR existiert nicht. Erstelle es..." mkdir -p "$BACKUP_DIR" if [ $? -eq 0 ]; then echo_success "Verzeichnis $BACKUP_DIR erfolgreich erstellt." else echo_error "Fehler beim Erstellen des Verzeichnisses $BACKUP_DIR. Skript wird abgebrochen." exit 1 fi fi # ======== Loop über Container ======== for CONTAINER in $CONTAINERS; do # Container ausgeben echo_info "Gefundener Container: $CONTAINER" # Root Passwort aus Environment-Variablen oder docker secrets auslesen MYSQL_ROOT_PASSWORD=$(docker exec $CONTAINER printenv MYSQL_ROOT_PASSWORD) if [ -z "$MYSQL_ROOT_PASSWORD" ]; then echo_warning "Kein Root-Passwort für Container $CONTAINER gefunden. Skippen..." continue fi # Liste der Datenbanken im Container DATABASES=$(docker exec $CONTAINER mysql -p"$MYSQL_ROOT_PASSWORD" -e "SHOW DATABASES;" | tail -n +2) # Loop über Datenbanken + Dump für jede Datenbank erstellen for DATABASE in $DATABASES; do # System-Datenbanken überspringen if [[ "$DATABASE" == "information_schema" || "$DATABASE" == "performance_schema" || "$DATABASE" == "mysql" || "$DATABASE" == "sys" ]]; then continue fi # Dump erstellen echo_info "Dump für Datenbank $DATABASE aus Container $CONTAINER erstellen..." docker exec $CONTAINER mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" --databases "$DATABASES" > "$BACKUP_DIR/$CONTAINER-$DATABASE-$DATE.sql" done done # ======== Finish ======== echo_info "Fertig"