web-dev-qa-db-fra.com

Redémarrer automatiquement mysql quand il meurt

J'ai loué un serveur rackspace pour exécuter mes projets personnels. Depuis que je suis bon marché, il a 256 Mo de RAM et honnêtement ne peut pas gérer beaucoup. De temps en temps, quand il y a une forte augmentation du trafic, le serveur décide de commencer à tuer les processus et il semble que mysqld est un outil populaire pour tuer. J'essaie de visiter mon site et je suis accueilli avec le message qu'il y a eu une erreur lors de l'établissement de la connexion à la base de données. L'inspection des journaux révèle que mysqld a été tué en raison d'un manque de mémoire.

Étant donné que je suis toujours aussi pauvre qu'hier et que je ne souhaite pas mettre à niveau la RAM de ma machine virtuelle rackspace, est-il possible de lui demander de redémarrer automatiquement mysqld après sa mort?

J'ai l'idée d'utiliser quelque chose comme crontab, mais hélas, je ne sais pas exactement quoi faire là-bas non plus. Je suppose que je suis un produit de la génération "Linux sur votre bureau" car je peux faire la plupart des choses sur mon ordinateur de bureau et mon ordinateur portable (qui fonctionnent presque exclusivement sous Linux), mais il me manque encore beaucoup de compétences en administration de serveur pour Linux.

Le serveur exécute CentOS 6.3

15
Los Frijoles

Ce n'est pas une solution propre, il serait évidemment préférable d'éviter le problème en premier lieu. Quoi qu'il en soit, je ne sais pas comment CentOS gère les services, mais je pense qu’il utilise service. Si tel est le cas, vous pouvez vérifier si le service mysql fonctionne avec

/sbin/service mysql status

Cette commande se ferme correctement si mysql est en cours d'exécution et renvoie un statut de sortie différent de 0 si i ne l'est pas. Vous pouvez donc démarrer le service s'il ne s'exécute pas avec cette commande:

/sbin/service mysql status || service mysql start

Vous pouvez ajouter cette ligne à /etc/crontab pour lancer cette commande toutes les minutes:

* * * * * /sbin/service mysql status || service mysql start
16
terdon

C'est un peu dérangeant.

mysqld est toujours redémarré par mysqld_safe car il y a une boucle infinie au bas de mysqld_safe pour vérifier les arrêts anormaux. Si l'erreur est trop grave, même mysqld_safe ne pourrait pas redémarrer mysqld lors des tentatives suivantes.

Etant donné cette situation pour laquelle mysqld_safe est conçu, il ne serait peut-être pas judicieux de forcer mysqld à démarrer si mysqld_safe le rejetera de toute façon.

Vous devez localiser le journal des erreurs dans my.cnf.

[mysqld]
log-error=log-filename

ou

[mysqld_safe]
log-error=log-filename

Lisez le fichier texte (probablement en exécutant tail -30 log-filename) et recherchez la source du traitement de mysqld en cours de fermeture.

6
RolandoMySQLDBA

Dans une tentative de force brutale pour que les choses restent opérationnelles sur un VPS à faible mémoire, j'ai utilisé une modification de answer de terdom pour vérifier et redémarrer MySQL.

/sbin/service mysqld status || service mysqld restart

Je devais changer mysql en mysqld pour que cela fonctionne. Sans cela, j'obtiendrais l'erreur "ERROR! MySQL is running but PID file could not be found".

Sur mon système CentOS 7.2, /sbin/service redirige vers /bin/systemctl status. La commande suivante est donc plus rapide à exécuter.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

J'ai fini par ajouter la ligne suivante à la crontab racine du système. Il vérifie toutes les minutes si MySQL est en cours d'exécution et redirige stdout vers null. Le démarrage du service ne produira rien à moins que quelque chose ne va pas, il n'est donc pas nécessaire d'ajouter la redirection null sur la dernière commande.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

Le double tuyau || signifie OR et exécutera la 2e commande si la première commande échoue. (Retourne un code de sortie supérieur à zéro.)

C'est comme dire: "Exécutez la 1ère commande, ou , si la 1ère commande échoue d'une manière ou d'une autre, exécutez la 2ème commande".

Ceci est différent du double perluète && qui revient à dire "Exécutez la 1ère commande, et , uniquement si la 1ère commande a réussi, exécutez la 2ème commande ".

3
Mike J

Ce qui suit provient de jonnyreeves.co.uk :


Et le coupable est php-fpm! Un rapide Google a trouvé un autre client Wordpress souffrant de symptômes similaires; le conseil était de modifier la configuration du pool php-fpm (/etc/php-fpm.d/www.conf) et de modifier la configuration de pm. Le principal changement consistait à passer de pm = dynamic à pm = ondemand avec une valeur de pm.max_children de 5 (basée sur l'observation d'environ 5% d'utilisation de la mémoire par travailleur). Après avoir modifié la configuration, j'ai redémarré tous les services et vérifié l'utilisation de la mémoire.

service php-fpm restart
service nginx restart
service mariadb restart

Après le redémarrage, la mémoire utilisée a été considérablement réduite.

1
AdrianoFerrari