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?
EDIT UPDATE comme 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.
mysqladmin shutdown
devrait fonctionner pour arrêter le serveur.
Je vois deux possibilités probables:
Qu'est-ce que dpkg --list mysql\*
dire?
Que dit /var/log/mysql.err? Ou les autres journaux mysql?
MODIFIER:
Donc mysqladmin shutdown
travaillé?
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? Fonctionnement debsums mysql-server-5.0
pourrait vous en dire plus. dpkg --listfiles mysql-server-5.0
pourrait 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
... Vous avez peut-être de la chance et ils ne l'ont cassé que ...
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 l'ancien et le nouveau serveur, 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.
Corrige le mot de passe de debian sys maint.
Recherchez maintenant 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 récupérer le fichier debian.cnf et de vous connecter avec cet utilisateur. N.B. Protégez ce compte d'utilisateur comme root.
2 autres conseils:
sh -x /etc/init.d/mysql restart
Cela vous montrera les commandes exécutées par le script init.
installez les paquets debsums, et vous pouvez tester quels paquets ont été modifiés (vérifiez qu'il est également disponible pour RPM, mais à mon humble avis fonctionne mieux).
pkill mysql
fonctionnera certainement
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.
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.
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.sock
avec la source MySQL et /var/run/mysqld/mysqld.sock
avec les binaires Debian.
La solution est de corriger le chemin du socket in /etc/mysql/debian.cnf
, en fournissant le bon socket=
. Ou en le conservant, mais changez celui dans /etc/mysql/my.cnf
.
Voici comment je l'ai découvert: dans /etc/init.d/mysql
quand 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 montré $MYADMIN ping
, lequel 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 est en cours d'exécution et que le socket: '/var/run/mysqld/mysqld.sock' existe!
J'ai donc jeté un œil à /etc/mysql/debian.cnf
et a découvert que c'était la mauvaise prise.
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, selon la configuration) pour voir s'il est bloqué sur une vraiment requête longue ou quelque chose et donc pas disposé à quitter gracieusement encore tout à fait.
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
utilisez la commande suivante:
$ mysqladmin shutdown
cela devrait être disponible dans le répertoire/usr/bin dans votre cas.
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