Dépannage — MySQL
Réplication cassée (binlog purgé)
Cause : le binary log (binlog) a été purgé sur le primary avant que le réplica n'ait pu le lire. C'est un problème connu du MariaDB Operator lorsque mariadbbackup n'est pas encore utilisé pour initialiser les nœuds.
Solution :
- Identifiez le réplica désynchronisé :
kubectl get pods -l app=mysql-<name> - Effectuez un dump depuis un réplica fonctionnel et restaurez-le sur le primary :
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 - Vérifiez que la réplication reprend correctement après la restauration.
Ce problème est référencé dans le MariaDB Operator. Une correction automatique est prévue dans les futures versions de l'opérateur.
Backup Restic échoué
Cause : les identifiants S3 sont incorrects, l'endpoint est inaccessible, ou le resticPassword ne correspond pas à celui utilisé lors de l'initialisation du dépôt.
Solution :
- Vérifiez les logs du pod de backup :
kubectl logs -l app=mysql-<name>-backup - Assurez-vous que les paramètres S3 sont corrects dans votre manifeste :
s3Bucket: le bucket existe et est accessibles3AccessKey/s3SecretKey: les clés sont validess3Region: la région correspond à celle du bucket
- Vérifiez que le
resticPasswordest identique à celui utilisé lors de la première sauvegarde. Un changement de mot de passe rend les anciennes sauvegardes inaccessibles. - Testez la connectivité vers l'endpoint S3 depuis le cluster.
Connexion refusée
Cause : les pods MySQL ne sont pas en cours d'exécution, le nom du Secret est incorrect, ou la limite maxUserConnections est atteinte.
Solution :
- Vérifiez que les pods sont en état
Running:kubectl get pods -l app=mysql-<name> - Récupérez les identifiants depuis le Secret. Le pattern est
mysql-<name>-auth:kubectl get tenantsecret mysql-<name>-auth -o jsonpath='{.data.password}' | base64 -d - Vérifiez que la limite
maxUserConnectionsn'est pas atteinte pour l'utilisateur concerné. - Testez la connexion depuis un pod dans le cluster :
kubectl run test-mysql --rm -it --image=mariadb:11 -- mysql -h mysql-<name> -P 3306 -u<user> -p
Pod en CrashLoopBackOff
Cause : le pod redémarre en boucle, généralement à cause d'un manque de mémoire (OOMKilled) ou d'une configuration invalide.
Solution :
- Consultez les logs du pod précédent pour identifier l'erreur :
kubectl logs mysql-<name>-0 --previous - Vérifiez si le pod a été tué pour dépassement mémoire (OOMKilled) :
kubectl describe pod mysql-<name>-0 | grep -i oom - Si c'est un problème de mémoire, augmentez le
resourcesPresetou définissez desresourcesexplicites :mysql.yamlspec:
resourcesPreset: medium # Passer de nano/micro à medium ou plus - Appliquez la modification et attendez le redémarrage :
kubectl apply -f mysql.yaml
Espace disque plein
Cause : le volume persistant est saturé par les données, les logs binaires ou les fichiers temporaires.
Solution :
- Vérifiez l'utilisation du disque dans le pod :
kubectl exec mysql-<name>-0 -- df -h /var/lib/mysql - Augmentez la taille du volume dans votre manifeste :
mysql.yaml
spec:
size: 20Gi # Augmenter depuis la valeur actuelle - Appliquez la modification :
kubectl apply -f mysql.yaml - Si le problème est urgent, nettoyez les données obsolètes depuis un client MySQL.
Ne réduisez jamais la valeur de size. L'augmentation de volume est supportée, mais la réduction ne l'est pas.