Fehlerbehebung — MySQL
Defekte Replikation (Binlog gelöscht)
Ursache: Das Binary Log (Binlog) wurde auf dem Primary gelöscht, bevor das Replika es lesen konnte. Dies ist ein bekanntes Problem des MariaDB Operators, wenn mariadbbackup noch nicht zur Initialisierung der Knoten verwendet wird.
Lösung:
- Identifizieren Sie das desynchronisierte Replika:
kubectl get pods -l app=mysql-<name> - Führen Sie einen Dump von einem funktionierenden Replika durch und stellen Sie ihn auf dem Primary wieder her:
mysqldump -h <replica-host> -P 3306 -u<user> -p<password> --column-statistics=0 <database> <table> > fix-table.sql
mysql -h <primary-host> -P 3306 -u<user> -p<password> <database> < fix-table.sql - Überprüfen Sie, dass die Replikation nach der Wiederherstellung korrekt fortgesetzt wird.
Dieses Problem ist im MariaDB Operator referenziert. Eine automatische Korrektur ist in zukünftigen Versionen des Operators geplant.
Restic-Backup fehlgeschlagen
Ursache: Die S3-Anmeldedaten sind falsch, der Endpoint ist nicht erreichbar oder das resticPassword stimmt nicht mit dem bei der Initialisierung des Repositories verwendeten überein.
Lösung:
- Überprüfen Sie die Logs des Backup-Pods:
kubectl logs -l app=mysql-<name>-backup - Stellen Sie sicher, dass die S3-Parameter in Ihrem Manifest korrekt sind:
s3Bucket: Der Bucket existiert und ist zugänglichs3AccessKey/s3SecretKey: Die Schlüssel sind gültigs3Region: Die Region entspricht der des Buckets
- Überprüfen Sie, dass das
resticPasswordidentisch mit dem bei der ersten Sicherung verwendeten ist. Eine Passwortänderung macht alte Sicherungen unzugänglich. - Testen Sie die Verbindung zum S3-Endpoint vom Cluster aus.
Verbindung verweigert
Ursache: Die MySQL-Pods laufen nicht, der Secret-Name ist falsch oder das maxUserConnections-Limit ist erreicht.
Lösung:
- Überprüfen Sie, dass die Pods den Status
Runninghaben:kubectl get pods -l app=mysql-<name> - Rufen Sie die Anmeldedaten aus dem Secret ab. Das Muster ist
mysql-<name>-auth:kubectl get tenantsecret mysql-<name>-auth -o jsonpath='{.data.password}' | base64 -d - Überprüfen Sie, dass das
maxUserConnections-Limit für den betreffenden Benutzer nicht erreicht ist. - Testen Sie die Verbindung von einem Pod im Cluster:
kubectl run test-mysql --rm -it --image=mariadb:11 -- mysql -h mysql-<name> -P 3306 -u<user> -p
Pod im CrashLoopBackOff
Ursache: Der Pod startet in einer Schleife neu, üblicherweise wegen Speichermangel (OOMKilled) oder einer ungültigen Konfiguration.
Lösung:
- Prüfen Sie die Logs des vorherigen Pods, um den Fehler zu identifizieren:
kubectl logs mysql-<name>-0 --previous - Prüfen Sie, ob der Pod wegen Speicherüberschreitung (OOMKilled) beendet wurde:
kubectl describe pod mysql-<name>-0 | grep -i oom - Bei einem Speicherproblem erhöhen Sie den
resourcesPresetoder definieren Sie expliziteresources:mysql.yamlspec:
resourcesPreset: medium # Von nano/micro auf medium oder höher wechseln - Wenden Sie die Änderung an und warten Sie auf den Neustart:
kubectl apply -f mysql.yaml
Festplatte voll
Ursache: Das persistente Volume ist durch Daten, Binary Logs oder temporäre Dateien gesättigt.
Lösung:
- Überprüfen Sie die Festplattennutzung im Pod:
kubectl exec mysql-<name>-0 -- df -h /var/lib/mysql - Erhöhen Sie die Volume-Größe in Ihrem Manifest:
mysql.yaml
spec:
size: 20Gi # Vom aktuellen Wert erhöhen - Wenden Sie die Änderung an:
kubectl apply -f mysql.yaml - Bei dringendem Bedarf bereinigen Sie veraltete Daten über einen MySQL-Client.
Verringern Sie niemals den Wert von size. Die Volume-Vergrößerung wird unterstützt, die Verkleinerung jedoch nicht.