Files
DB-Cluster/docker/scripts/recover_cluster.sh
T

54 lines
1.9 KiB
Bash

#!/usr/bin/env bash
# recover_cluster.sh
# Dieses Skript repariert den Galera Cluster nach einem harten Neustart oder Absturz.
# Es sollte auf dem Hauptknoten (Node 1) ausgeführt werden.
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
NODE1_DATA="$PROJECT_ROOT/mariadb/n1/data"
GRASTATE_FILE="$NODE1_DATA/grastate.dat"
GVWSTATE_FILE="$NODE1_DATA/gvwstate.dat"
echo "--- Galera Cluster Recovery Start ---"
# 1. Alle Container auf diesem Server stoppen
echo "[1/5] Stoppe lokale Container..."
cd "$PROJECT_ROOT/mariadb/n1"
docker compose down > /dev/null 2>&1
# 2. View State bereinigen (verhindert hängenbleiben in alter Sicht)
if [ -f "$GVWSTATE_FILE" ]; then
echo "[2/5] Lösche veraltete View-State Datei..."
rm "$GVWSTATE_FILE"
fi
# 3. safe_to_bootstrap in grastate.dat auf 1 setzen
if [ -f "$GRASTATE_FILE" ]; then
echo "[3/5] Forciere safe_to_bootstrap in grastate.dat..."
# Nutze sed um den Wert sicher auf 1 zu setzen
sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/' "$GRASTATE_FILE"
else
echo "WARNUNG: $GRASTATE_FILE nicht gefunden. Ist der Pfad korrekt?"
fi
# 4. Node 1 mit Bootstrap-Flag neu starten
echo "[4/5] Starte Node 1 im Bootstrap-Modus..."
GALERA_BOOTSTRAP="--wsrep-new-cluster" docker compose up -d
# 5. Status-Überprüfung
echo "[5/5] Warte auf Initialisierung (max 30s)..."
for i in {1..15}; do
STATUS=$(docker exec mariadb_n1 mariadb -uworker -pbBHofurUJWKzPE8Z -e "SHOW STATUS LIKE 'wsrep_local_state_comment';" 2>/dev/null | grep 'Synced')
if [ ! -z "$STATUS" ]; then
echo "ERFOLG: Node 1 ist SYNCED und bereit."
echo "Du kannst jetzt auf den anderen Servern die init_cluster Skripte starten."
exit 0
fi
sleep 2
done
echo "FEHLER: Node 1 konnte nicht automatisch synchronisiert werden."
echo "Bitte prüfe die Logs mit: docker logs mariadb_n1"
exit 1