#!/bin/bash # Erstellt einen neuen MySQL-Container "logbuch_mysql" und migriert # die 5 App-relevanten Tabellen aus dem bestehenden "db"-Container. set -e # ── Konfiguration ──────────────────────────────────────────────────────────── SRC_CONTAINER="db" SRC_DB="sternwarte" SRC_ROOT_PASS="SFluorit" NEW_CONTAINER="logbuch_mysql" NEW_DB="sternwarte" NEW_ROOT_PASS="SFluorit" # ggf. hier ändern NEW_PORT="3307" # Host-Port (3306 ist schon belegt) MYSQL_IMAGE="arm64v8/mysql:lts" NETWORK="sternwarte_default" TABLES="beos objekte logbuch logbuch_beos logbuch_objekte" # ── Hilfsfunktion ──────────────────────────────────────────────────────────── wait_for_mysql() { local container="$1" local pass="$2" echo -n "Warte auf MySQL in '$container' " for i in $(seq 1 60); do if docker exec "$container" mysqladmin ping -u root -p"$pass" --silent 2>/dev/null; then echo " bereit." return 0 fi echo -n "." sleep 2 done echo "" echo "FEHLER: MySQL in '$container' nicht erreichbar nach 120s." >&2 exit 1 } # ── Prüfen ob Quell-Container läuft ───────────────────────────────────────── if ! docker inspect "$SRC_CONTAINER" &>/dev/null; then echo "FEHLER: Quell-Container '$SRC_CONTAINER' nicht gefunden." >&2 exit 1 fi echo "Quell-Container '$SRC_CONTAINER' gefunden." # ── Alten Ziel-Container entfernen falls vorhanden ────────────────────────── if docker inspect "$NEW_CONTAINER" &>/dev/null; then echo "Container '$NEW_CONTAINER' existiert bereits — wird gestoppt und entfernt..." docker rm -f "$NEW_CONTAINER" fi # ── Neuen Container starten ────────────────────────────────────────────────── echo "Starte neuen Container '$NEW_CONTAINER'..." docker run -d \ --name "$NEW_CONTAINER" \ --network "$NETWORK" \ -p "${NEW_PORT}:3306" \ -e MYSQL_ROOT_PASSWORD="$NEW_ROOT_PASS" \ -e MYSQL_DATABASE="$NEW_DB" \ "$MYSQL_IMAGE" wait_for_mysql "$NEW_CONTAINER" "$NEW_ROOT_PASS" # ── Daten migrieren ────────────────────────────────────────────────────────── echo "Migriere Tabellen: $TABLES" echo "(Dump von '$SRC_CONTAINER' → Import in '$NEW_CONTAINER')" docker exec "$SRC_CONTAINER" mysqldump \ -u root -p"$SRC_ROOT_PASS" \ --single-transaction \ --no-tablespaces \ "$SRC_DB" $TABLES \ | docker exec -i "$NEW_CONTAINER" mysql \ -u root -p"$NEW_ROOT_PASS" \ "$NEW_DB" echo "Migration abgeschlossen." # ── Zeilenzähler zur Verifikation ──────────────────────────────────────────── echo "" echo "Zeilenzähler (Quelle → Ziel):" for TABLE in $TABLES; do SRC_COUNT=$(docker exec "$SRC_CONTAINER" mysql -u root -p"$SRC_ROOT_PASS" -sN \ -e "SELECT COUNT(*) FROM $TABLE;" "$SRC_DB" 2>/dev/null) DST_COUNT=$(docker exec "$NEW_CONTAINER" mysql -u root -p"$NEW_ROOT_PASS" -sN \ -e "SELECT COUNT(*) FROM $TABLE;" "$NEW_DB" 2>/dev/null) STATUS="✓" [ "$SRC_COUNT" != "$DST_COUNT" ] && STATUS="✗ ABWEICHUNG" printf " %-25s %5s → %5s %s\n" "$TABLE" "$SRC_COUNT" "$DST_COUNT" "$STATUS" done # ── Abschluss ───────────────────────────────────────────────────────────────── echo "" echo "══════════════════════════════════════════════════════" echo "Neuer Container: $NEW_CONTAINER" echo " Netzwerk: $NETWORK" echo " Host-Port: $NEW_PORT" echo " Datenbank: $NEW_DB" echo "" echo "Nächster Schritt — .env anpassen:" echo " DB_HOST=$NEW_CONTAINER" echo " DB_PASS=$NEW_ROOT_PASS" echo "══════════════════════════════════════════════════════"