Après la mise à niveau vers 15.04, j'ai eu beaucoup de plaisir à connaître systemd. Je pense que tout fonctionne, sauf que je ne parviens pas à arrêter mysql.service; la commande systemctl se bloque et mysql continue à fonctionner. Quelqu'un d'autre en at-il fait l'expérience ou pourrait-il savoir ce qui se passe?
J'ai eu le même problème (mise à niveau vers 15.04, en utilisant les fichiers officiels et la configuration).
Je devais apporter les modifications suivantes pour pouvoir arrêter manuellement le démon mysql
avec sytemctl
et automatiquement au redémarrage/à l'arrêt du système:
Rendre /etc/mysql/debian.cnf
lisible pour l’utilisateur mysql
avec
Sudo chgrp mysql /etc/mysql/debian.cnf; Sudo chmod 640 /etc/mysql/debian.cnf
Fournissez un fichier mysql.service
légèrement modifié:
Sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/
Sudo chmod 755 /etc/systemd/system/mysql.service
Fournissez une commande d'arrêt explicite en ouvrant le fichier copié dans un éditeur:
Sudo nano /etc/systemd/system/mysql.service
et en ajoutant la ligne suivante dans la section [Service]
:
ExecStop=/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown
Dans Nano, utilisez Ctrl + O pour enregistrer (méthode Linux!), Ctrl + X pour quitter.
Faites connaître le nouveau fichier de service au système:
Sudo systemctl daemon-reload
J'ai eu un problème similaire avec mysql/mariadb ne pas m'arrêter lorsqu'on me le demande par systemd, soit à l'arrêt, soit appelé manuellement avec Sudo service mysql stop
.
Dans mon cas, je suis en train de double-démarrer Ubuntu/Windows en mode UEFI, et ces systèmes d'exploitation interprètent différentes heures matérielles. Les deux systèmes d'exploitation sont donc synchronisés avec les serveurs de temps Internet au démarrage.
MySQL (et Mariadb) ne pouvait pas s’arrêter si l’heure du matériel changeait en cours d’exécution.
Vous devez différer le démarrage de MySQL après la synchronisation. Idéalement, cela serait fait en insérant une dépendance temporelle sur mysql avec After: time-sync
mais cela ne fonctionnait pas pour moi.
La solution qui a fonctionné pour moi (vous pouvez remplacer mysql par mariadb pour le même effet):
Désactiver mysql avec Sudo systemctl disabled mysql.service
Créez un script (assurez-vous qu'il est exécutable) qui démarrera mysql après un certain délai /usr/bin/delay_mysql
avec le contenu suivant:
#!/bin/sh
sleep 30s
/etc/init.d/mysql start
Créez un service systemd pour exécuter votre nouveau script /etc/systemd/system/delay_mysql.service
avec le contenu suivant:
[Unit]
Description=Delay start of MySQL / MariaDB
[Service]
Type=oneshot
ExecStart=/usr/bin/delay_mysql
[Install]
WantedBy=multi-user.target
Enregistrez votre nouveau service avec Sudo systemctl enable delay_mysql.service
Cela fera exécuter votre script à plusieurs niveaux d'utilisateurs, qui sont 3,4,5 sur Ubuntu.
Votre problème est thread_pool_size. S'il est beaucoup plus élevé que le nombre de cœurs/threads, vous ne pourrez pas vous arrêter correctement à moins d'utiliser la commande mysqladmin shutdown.
Exemple: vous avez une CPU à 2 cœurs avec 4 threads. Si vous le définissez 1-4 - cela fonctionnera bien. Si vous le définissez sur 16, comme indiqué dans de nombreux blogs "hautes performances", il sera bloqué.
J'ai eu le même problème avec Ubuntu 15.10 Desktop et j'ai trouvé le moyen de le réparer:
le paramètre log_error dans /etc/mysql/mysql.conf.d/mysqld.cnf a été mis en commentaire. Après avoir supprimé le paramètre, systemd éteint mysqld sans problème.
dans mon cas, il y avait une incompatibilité de mot de passe pour l'utilisateur de maintenance debian-sys-maint
entre un dans /etc/mysql/debian.cnf
et un dans la base de données MySQL.
Cet utilisateur est utilisé pour l’arrêt de MySQL et d’autres fonctions. Après la mise à jour de MySQL, il peut arriver qu’il existe un décalage entre le fichier et la base de données. Cela peut également arriver si vous déplacez votre base de données d’un MySQL à un autre. Si vous importez toutes les bases de données et les utilisateurs d’autres MySQL sur une machine différente, vous devez resynchroniser votre mot de passe d’utilisateur de maintenance (debian-sys-maint
).
Vous devez faire: vérifiez votre mot de passe actuel dans le fichier ubuntu/debian:
Sudo cat /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
Host = localhost
user = debian-sys-maint
password = n4aSHUP04s1J32X5
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user = debian-sys-maint
password = n4aSHUP04s1J32X5
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Vous pouvez voir votre mot de passe que le système utilisera ici: password = n4aSHUP04s1J32X5
La prochaine étape consiste à mettre à jour MySQL avec le même mot de passe: Connectez-vous à MySQL:
~$ mysql -u root -p
Tapez votre mot de passe pour accéder à MySQL
mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'n4aSHUP04s1J32X5';**
Après cela, plus de problèmes d'arrêt, pas d'attente de 10 minutes, pas de problème d'installation d'applications utilisant ce compte de maintenance comme phpmyadmin.
PDATE: Donc, malheureusement, cela n'a pas résolu le problème. Cela a créé une sorte de hasard - parfois, je peux arrêter le service sans problème une autre fois, il sera gelé à l'arrêt du service.
Juste quand vous copiez mysql.service
vous devrez faire un chmod
après.
cp /lib/systemd/system/mysql.service /etc/systemd/system/
chmod 755 /etc/systemd/system/mysql.service