Impossible de démarrer / arrêter le service mysql

28

Reprendre un serveur Web Debian Etch avec MySQL en cours d'exécution.

Je démarre, arrête et redémarre habituellement msyql en utilisant:

/etc/init.d/mysql restart

Pour une raison quelconque sur cette configuration, j'obtiens ce qui suit:

: ~ # /etc/init.d/mysql stop

Arrêt du serveur de base de données MySQL: mysqld a échoué!

Le processus mysql fonctionne bien:

:~# ps aux | grep mysql 
root      2045  0.0  0.1   2676  1332 ?        S    Jun25   0:00 /bin/sh /usr/bin/mysqld_safe
mysql     2082  0.6 10.7 752544 111188 ?       Sl   Jun25  18:49 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock
root      2083  0.0  0.0   1568   504 ?        S    Jun25   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root     11063  0.0  0.0   2856   716 pts/0    S+   17:29   0:00 grep mysql

Je suis sûr qu'il existe des moyens très simples de le faire, mais je veux également comprendre ce qui se passe. Pourquoi la manière typique ne fonctionne pas pour moi?

MODIFIER LA MISE À JOUR en tant que mise à jour:

JBRLSVR001:/var/log/mysql# mysqladmin shutdown
JBRLSVR001:/var/log/mysql# dpkg --list mysql\*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed 
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name                                         Version                                      Description
 +++-============================================-============================================-========================================================================================================
un  mysql-client                                 <none>                                       (no description available)
un  mysql-client-4.1                             <none>                                       (no description available)
ii  mysql-client-5.0                             5.0.32-7etch8                                mysql database client binaries
ii  mysql-common                                 5.0.32-7etch8                                mysql database common files (e.g. /etc/mysql /my.cnf)
un  mysql-common-4.1                             <none>                                       (no description available)
ii  mysql-server                                 5.0.32-7etch8                                mysql database server (meta package depending on the latest version)
un  mysql-server-4.1                             <none>                                       (no description available)
ii  mysql-server-5.0                             5.0.32-7etch8                                mysql database server binaries

L'arrêt de mysqladmin fonctionne mais je suis toujours curieux de savoir pourquoi les commandes /etc/init.d/mysql ne fonctionnent pas.

Orgue Derek
la source
Pour moi, le problème était que l'installation à la main recherchait /tmp/mysql.sockplutôt que /var/run/mysqld/mysqld.sock. Le script des responsables Debian émettait donc une erreur, en silence. Il suffit de réparer socket=le/etc/mysql/debian.cnf
Yvan

Réponses:

25
mysqladmin shutdown

devrait fonctionner pour arrêter le serveur.

Je vois deux possibilités probables:

  1. MySQL a un problème et refuse de s'arrêter pour une raison quelconque.
  2. L'administrateur précédent a fait quelque chose d'étrange. Soit vous avez modifié le script init.d, soit vous n'avez pas du tout pris la peine d'utiliser les paquets Debian pour installer MySQL.

Que dpkg --list mysql\*dit-on?

Que dit /var/log/mysql.err? Ou les autres journaux mysql?

MODIFIER:

Alors ça mysqladmin shutdowna marché?

Selon cela, le paquet mysql-server est installé (mysql-server-5.0; le paquet mysql-server n'est probablement qu'un talon). Alors ils ont peut-être installé dessus? La course debsums mysql-server-5.0pourrait vous en dire plus. dpkg --listfiles mysql-server-5.0pourrait aussi aider ...

Que contient réellement /etc/init.d/mysql? Je n'ai pas vérifié cette version spécifique du package, mais il devrait essayer d'utiliser mysqladmin shutdown... Peut-être que vous avez de la chance et ils ne l'ont cassé que ...

freiheit
la source
cheers, a ajouté plus d'informations au post.
Derek Organ
Je soupçonne qu'ils n'ont pas utilisé les paquets Debian pour installer mysql
Derek Organ
quelqu'un a utilisé un paquet Debian au moins une fois. Ils ont peut-être compilé à partir de la source et écrasé les fichiers réels, ou l'ont cassé d'une autre manière ...
freiheit
22

Pourquoi cela se produit

Il s'agit d'un problème courant si vous effectuez une importation mysql et écrasez la base de données mysql elle-même, par exemple lorsque vous effectuez une restauration à partir d'une sauvegarde mysqldump -A.

C'est une bonne chose: vous voudrez probablement sauvegarder tous vos utilisateurs mysql, autorisations, etc. - mais cela peut faire des ravages avec des choses comme l'utilisateur debian-sys-maint utilisé pour arrêter proprement mysql.

Bien que cette nouvelle base de données puisse éventuellement changer à la fois le mot de passe root et le mot de passe debian-sys-maint, bien sûr, elle ne changera pas automatiquement le mot de passe debian-sys-maint attendu dans /etc/mysql/debian.cnf. En fait, à moins que vous n'ayez également sauvegardé ce fichier, vous ne savez probablement plus quel est ce mot de passe!

Réinitialisation du mot de passe root mysql (facultatif)

Tout d'abord. Si le mot de passe root mysql était différent entre les anciens et les nouveaux serveurs, vous pouvez utiliser mysqladmin pour le corriger:

mysql -p -u root password 'newpassword'

Cependant, lorsque vous avez installé apt-get mysql-server, il vous a probablement demandé le nouveau mot de passe root mysql et vous avez probablement utilisé le même que celui que vous utilisiez auparavant.

Correction du mot de passe de debian sys maint.

Alors maintenant, recherchez le mot de passe debian sys maint que debian a créé pour vous lorsque vous l'avez installé sur le nouveau serveur. (Vous avez besoin de sudo car il doit s'agir d'un fichier hautement protégé.)

sudo cat /etc/mysql/debian.cnf

Maintenant, connectez-vous à mysql en utilisant le mot de passe root que vous avez défini ci-dessus:

mysql -p -u root   # use your new password when prompted

Réinitialisez le mot de passe de l'utilisateur debian-sys-maint et n'oubliez pas de vider les privilèges:

>  SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD('samepassword');
>  FLUSH PRIVILEGES;
>  QUIT

Testez pour vous assurer que cela fonctionne:

sudo /etc/init.d/mysql restart

Conseil rapide

Si jamais vous avez besoin de réinitialiser le mot de passe root du serveur sans avoir à arrêter le serveur, ce compte d'utilisateur a le pouvoir de le faire - il suffit de chatter le fichier debian.cnf et de vous connecter avec cet utilisateur. NB Protégez ce compte utilisateur comme root.

Jamieson Becker
la source
2
Merci, Jamieson, cela m'a potentiellement fait gagner des heures de travail.
slhck
1
Génial et totalement le bienvenu! J'ai dû me rabattre sur ce dossier plus souvent que je ne l'admets;)
Jamieson Becker
1
Réponse brillante. L'importation d'un vidage de base de données (et avec lui, le mot de passe root) était exactement la raison dans mon cas. La seule différence est que mon fichier debian.cnf utilisait l'utilisateur "root" mysql au lieu de "debian-sys-maint". J'ai simplement mis le mot de passe root dans debian.cnf et maintenant je peux contrôler mysql via "service mysql <command>".
Tomasz P. Szynalski
6

2 autres conseils:

sh -x /etc/init.d/mysql restart

Cela vous montrera les commandes exécutées par le script init.

installez le paquet debsums, et vous pouvez tester quels paquets ont été modifiés (vérifiez qu'il est également disponible pour RPM, mais IMHO fonctionne mieux).

elcuco
la source
1
J'ai eu le même problème que OP et l'exécution de cette commande suggérée "Access denied for user 'debian-sys-maint'@'localhost'", ce qui était absolument correct: ma base de données mysql n'avait pas encore attribué d' autorisations, donc mysql stopn'avait pas les autorisations dans la base de données elle-même pour s'arrêter. Un manuel mysqladmin shutdownfonctionnait parfaitement.
jevon
5
pkill mysql

fonctionnera certainement

Jonathan
la source
C'est ce qui a résolu ma question "l'arrêt du serveur de base de données mysql mysqld a échoué". Vous devriez obtenir un million de points!
Hans Wassink
2

En supposant que le paquet est quelque peu étrange, le problème pourrait être le fichier pid. Je soupçonne que les nouveaux paquets ou l'installation compilée n'ont pas créé / var / run / mysql / ou tout ce qui est standard sur Debian pour le fichier pid à écrire ou que le script init recherche le fichier mysqld.pid à un autre endroit. Si vous pouvez corriger l'inadéquation du fichier init / pid, les choses devraient probablement fonctionner.

kashani
la source
Le script init n'utilise pas le fichier pid pour arrêter le serveur.
theotherreceive
2

Le script d'arrêt mysql utilise l'utilisateur debian-sys-maint pour exécuter «mysqladmin shutdown», en lisant le mot de passe de l'utilisateur dans /etc/mysql/debian.cnf. Vous devez vérifier que ce fichier existe et que vous pouvez exécuter l'arrêt mysqladmin en tant que cet utilisateur.

l'autre reçoit
la source
1

Vous pouvez techniquement y mettre fin avec:

pkill -9 mysqld

Mais vous pourriez perdre des données?

Vous feriez mieux de demander à quelqu'un à http://www.serverfault.com

John Kurlak
la source
Je suis conscient de le faire de cette façon, mais je ne défie pas ce que je cherche à faire régulièrement.
Derek Organ
1

L'utilisation de "pkill mysql" entraînera également la perte de données, en particulier si elle est appelée "pkill -9" :(

Je recommanderais également d'utiliser 'sh -x' pour voir quel pourrait être le problème avec le script init, et vous pouvez également consulter les journaux d'erreurs pour MySQL (/ var / log / mysql ou / var / lib / mysql, en fonction de la configuration) pour voir s'il est bloqué sur une requête très longue ou quelque chose comme ça et donc pas disposé à quitter gracieusement encore.

nixgeek
la source
1

Pour donner suite au commentaire de votre question, je vais écrire une réponse complète:

Le problème est que le socket par défaut est /tmp/mysql.sockavec la source MySQL et /var/run/mysqld/mysqld.sockavec les binaires Debian.

La solution est de fixer le chemin du socket en /etc/mysql/debian.cnffournissant le bien socket=. Ou en le gardant, mais changez ensuite celui-ci /etc/mysql/my.cnf.

Voici comment je l'ai découvert: /etc/init.d/mysqlquand il y a le message «échoué», vous avez cette ligne appelée:

echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug

Cela m'a fait remarquer $MYADMIN ping, ce qui est mysqladmin --defaults-file=/etc/mysql/debian.cnf ping. L'exécution de cette même commande se termine sur:

/ usr / bin / mysqladmin: échec de la connexion au serveur sur 'localhost'

erreur: 'Impossible de se connecter au serveur MySQL local via le socket' /var/run/mysqld/mysqld.sock '(2)'

Vérifiez que mysqld fonctionne et que le socket: '/var/run/mysqld/mysqld.sock' existe!

J'ai donc jeté un coup d'œil /etc/mysql/debian.cnfet j'ai découvert que c'était la mauvaise prise.

Yvan
la source
0

utilisez la commande suivante:

$ mysqladmin shutdown

cela devrait être disponible dans le répertoire / usr / bin dans votre cas.

Masood Syed
la source
0

vous devez être un super utilisateur pour commencer à arrêter mysql (et la plupart des autres services) sur debian.

Je ne sais pas si vous l'êtes déjà ou pas ... sinon, vous devez faire l'une des

  • connectez-vous en tant que root
  • mettez sudo avant votre commande /etc/init.d/mysql restart (il vous demandera votre mot de passe et vous devrez être dans le groupe sudoers)
benlumley
la source