Systemd Mysql ne s'arrêtera pas


17

Après la mise à niveau vers 15.04, j'ai eu beaucoup de plaisir à découvrir systemd. Je pense que tout fonctionne, sauf que je ne peux pas arrêter mysql.service; la commande systemctl se bloque et mysql continue de fonctionner. Quelqu'un d'autre a-t-il vécu cela ou pourrait-il savoir ce qui se passe?


2
Par défaut, il annule le service avec SIGKILL après 3 minutes (si le service ne se termine pas normalement). Vous devrez probablement lire les configurations de mysql.service.
Velkan

2
Quelle version de MySQL utilisez-vous? Avez-vous utilisé leur mysql.servicescript natif ou avez-vous lancé le vôtre?
Jos

C'est 5.6 qui sort du repo officiel vif. J'utilise le script fourni avec ce package.
Craig Dunford

Nous avons eu le même problème et déposé un rapport de bogue .
EOLE team du

Réponses:


25

J'ai eu le même problème (mise à niveau vers 15.04, en utilisant les fichiers officiels et la configuration).

J'ai dû apporter les modifications suivantes pour pouvoir arrêter le mysqldémon manuellement avec sytemctlet automatiquement lors du redémarrage / arrêt du système:

  1. Rendre /etc/mysql/debian.cnflisible pour l' mysqlutilisateur avec

    sudo chgrp mysql /etc/mysql/debian.cnf; sudo chmod 640 /etc/mysql/debian.cnf
    
  2. Fournissez un mysql.servicefichier 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 sous la [Service]section:

    ExecStop=/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown
    

    Dans Nano, utilisez Ctrl + O pour sauvegarder (façon Linux!), Ctrl + X pour quitter.

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

    sudo systemctl daemon-reload
    

Mon Kubuntu a commencé à geler pendant l'arrêt avec Un travail d'arrêt est en cours d'exécution pour MySQL Community Server [1min 16s / 10min] . Cette réponse a résolu le problème, merci beaucoup.
lolmaus - Andrey Mikhaylov

Ma mise à niveau 14.10 -> 15.04 (qui a déplacé MySQL 5.5 vers 5.6) a provoqué le même problème. Bien que MySQL «fonctionne», il ne s'arrête pas correctement, donc Ubuntu se bloque à l'arrêt. Il semble que le problème soit lié au changement de version de MySQL combiné au remplacement de systemd par upstart. Ce lien couvre certaines des mises à jour de la configuration de MySQL pour trier les avertissements, etc. Le démarrage de MySQL se plaint toujours également d'un arrêt incorrect, car systemd ne fait que tuer le processus après 10 minutes, si vous pouvez attendre aussi longtemps.
Mike

1
Même problème dans Debian Jessie / Testing avec MySQL 5.6 - corrigé grâce à vous :)
Majenko

Je déteste devoir faire ça mais je suis tellement content que ça marche, merci Udo!
Gabriel Baker du

Cela n'a pas résolu le problème sur LinuxMint 18.
sivaprasadreddy.k

1

J'ai eu le même problème avec Ubuntu 15.10 Desktop et j'ai trouvé un moyen de le résoudre:

Le paramètre log_error dans /etc/mysql/mysql.conf.d/mysqld.cnf a été mis en commentaire. Après avoir décommenté le paramètre, systemd effectue l'arrêt de mysqld sans problème.


J'ai eu le même problème sur Ubuntu LTS 16.04. Seule la désactivation du fichier error.log fonctionnait. Maintenant mysqld écrit via l' --log-syslogoption dans le journal. Peut-être une raison: le système de fichiers racine était btrfs.
ingopingo

1

Votre problème est thread_pool_size. S'il est beaucoup plus élevé que le nombre de cœurs / threads, vous ne pourrez pas arrêter correctement, sauf en utilisant la commande d'arrêt mysqladmin.

Par exemple: Vous avez 2 cœurs CPU avec 4 threads. Si vous le définissez 1-4 - cela fonctionnera bien. Si vous le définissez sur 16, comme conseillé dans de nombreux blogs «haute performance», il sera brisé.


1

J'ai eu un problème similaire avec mysql / mariadb ne s'arrêtant pas lorsque cela était demandé par systemd , à l'arrêt ou appelé manuellement avec sudo service mysql stop.

Dans mon cas, je double Ubuntu / Windows en mode UEFI, et ces systèmes d'exploitation interprètent l'heure matérielle différente, de sorte que les deux systèmes d'exploitation se synchronisent avec les serveurs de temps Internet au démarrage.

MySQL (et Mariadb) n'arrivait pas à s'arrêter si l'heure du matériel changeait pendant son exécution.

Vous devez différer le démarrage de MySQL après la synchronisation horaire. Idéalement, cela serait fait en insérant une dépendance temporelle sur mysql avec After: time-syncmais cela n'a pas fonctionné pour moi.

La solution qui a fonctionné pour moi (vous pouvez remplacer mysql par mariadb pour le même effet):

  1. Désactivez 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_mysqlavec le contenu:

    #!/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 son contenu:

    [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 entraînera l'exécution de votre script à des niveaux multi-utilisateurs, qui sur Ubuntu sont 3,4,5.


Cela a résolu mon problème. Cependant, il est très important de noter qu'avant de réinstaller MySql, vous devez désactiver delay_mysql.service, sinon vous obtenez une erreur.
SiGe

0

Au moment de la copie, mysql.servicevous devrez faire un chmodaprès.

cp /lib/systemd/system/mysql.service /etc/systemd/system/
chmod 755 /etc/systemd/system/mysql.service

0

dans mon cas, il n'y avait pas de correspondance de mot de passe pour l'utilisateur de maintenance debian-sys-maintentre un /etc/mysql/debian.cnfet 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 y ait un décalage entre le fichier et la base de données. Cela peut également se produire 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 debian-sys-maintmot de passe utilisateur de maintenance ( ).

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 ce système utilisera ici: password = n4aSHUP04s1J32X5

L'étape suivante 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, plus de problèmes d'installation d'applications qui utilisent ce compte de maintenance comme phpmyadmin.

MISE À JOUR: Malheureusement, cela n'a pas résolu le problème. Cela l'a rendu un peu aléatoire - parfois je peux arrêter le service sans problème une autre fois, il se bloquera à l'arrêt du service.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.