web-dev-qa-db-fra.com

Systemd Mysql ne s'arrête pas

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?

17
Craig Dunford

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:

  1. 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
    
  2. 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
    
  3. 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.

  4. Faites connaître le nouveau fichier de service au système:

    Sudo systemctl daemon-reload
    
25
Udo

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):

  1. Désactiver mysql avec Sudo systemctl disabled mysql.service

  2. 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
    
  3. 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  
    
  4. 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.

1
zero-day

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é.

1
Drakula963

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.

1
mikko356

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.

0
Patryk

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
0
Martin