J'ai récemment fait une nouvelle installation d'Ubuntu 16.04. J'ai également installé mysql-server
et mysql-client
(leur version par défaut 5.7.12) via apt-get install
.
Parce que 5.7.12 montrait quelques problèmes, j'ai décidé de le désinstaller. J'ai d'abord essayé apt-get remove mysql-server mysql-client
, mais j'ai constaté que des artefacts tels que /etc/mysql
et /var/lib/mysql
n'étaient pas supprimés.
J'ai ensuite essayé apt-get --purge removed mysql-server mysql-client
, mais toujours pas de différence.
Je les ai donc supprimés manuellement (via rm -rf
). J'ai également supprimé manuellement tous les fichiers *mysql*
de /usr/
provenant de n'importe quel paquet de dépendance mysql-*
comme mysql-common
.
Cependant, maintenant, lorsque je souhaite réinstaller mysql-server and -client
, je constate que je ne peux pas.
En fait, je suis maintenant dans un état où je ne peux ni apt-get remove mysql-server
ni apt-get install mysql-server
!
Comment résoudre la situation dans laquelle je suis? Si les métadonnées de mon référentiel de paquets local sont corrompues, comment puis-je les réparer?
Je détesterais réinstaller tout le système d'exploitation béni avec toutes mes autres applications et mon environnement, une fois de plus juste à cause de mysql-server
.
Par exemple, voici l'erreur que je reçois lorsque j'essaie de supprimer mysql-server
:
$ apt-get remove mysql-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libaio1 mysql-client-5.7 mysql-client-core-5.7 mysql-common mysql-server-5.7 mysql-server-core-5.7
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
mysql-server
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
2 not fully installed or removed.
After this operation, 159 kB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 237601 files and directories currently installed.)
Removing mysql-server (5.7.12-0ubuntu1) ...
Setting up mysql-server-5.7 (5.7.12-0ubuntu1) ...
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
dpkg: error processing package mysql-server-5.7 (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
mysql-server-5.7
E: Sub-process /usr/bin/dpkg returned an error code (1)
Et en essayant d’installer, j’obtiens cette erreur:
$ apt-get -f install mysql-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
mysql-server
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
Need to get 0 B/10.1 kB of archives.
After this operation, 159 kB of additional disk space will be used.
Selecting previously unselected package mysql-server.
(Reading database ... 237599 files and directories currently installed.)
Preparing to unpack .../mysql-server_5.7.12-0ubuntu1_all.deb ...
Unpacking mysql-server (5.7.12-0ubuntu1) ...
Setting up mysql-server-5.7 (5.7.12-0ubuntu1) ...
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
dpkg: error processing package mysql-server-5.7 (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
Voici le résultat de apt-get install -f
:
$ apt-get install -f
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
2 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up mysql-server-5.7 (5.7.12-0ubuntu1) ...
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
dpkg: error processing package mysql-server-5.7 (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
Modifié le 10 janvier 2017 : il s'agit d'un commentaire majeur de ce message destiné à corriger les problèmes graves qui se posent dans ce dernier.
L'erreur au cœur
Le problème est que le package est toujours sur le système dans un état à moitié installé et à moitié configuré et doit être explicitement supprimé.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
Ce que ça dit vraiment, c'est que le paquet mysql-server-5.7
est une dépendance de mysql-server
, est déjà installé, mais n'est pas configuré. Il vous faut donc purge
pour supprimer les chapelures laissées par mysql-server-5.7
.
Sudo apt purge mysql-server mysql-server-5.7
Justification
Lorsque vous installez un logiciel à l’aide de apt
name__, il gère automatiquement les dépendances.
Lorsque vous supprimez certains packages, il peut ne pas gérer ces mêmes dépendances. Dans le cas de cet article, cette dépendance est mysql-server-5.7
.
Vous pouvez vérifier l'état du package en exécutant la commande suivante.
dpkg-query -l [package-name-here]
Généralement, si vous voyez le code un
ou rc
à la gauche du nom du paquet, vous serez en mesure de dire s'il s'agit bien d'un paquet cassé.
Lorsque j'ai rencontré ce problème, c'était avec libapache2-mod-php
et libapache2-mod-php7.0
. C'était ma sortie.
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===========================-==================-==================-============================================================
un libapache2-mod-php <none> <none> (no description available)
Dans mon cas, il a affirmé que l'état de mon paquet est inconnu et qu'il n'est pas installé (le code un
name__) sur mon système.
Lorsque vous indiquez apt
à remove
name__, il peut laisser des packages, des fichiers de configuration et d'autres éléments qui peuvent poser problème lors d'installations automatisées.
Lorsque vous indiquez apt
à purge
name__, il est préférable de supprimer tout fil d'Ariane que remove
pourrait avoir laissé.
Au départ, j'ai déclaré que je supposais que le processus fonctionnait toujours, mais probablement qu'il était inactif ou mort.
Le meilleur moyen de vérifier si le service interfère avec la suppression de votre paquet est de vérifier ce service en premier.
1) Recherche du service mysql
En utilisant l'erreur système que nous a donnée apt
name__, nous pouvons en fait utiliser systemctl
pour rechercher l'erreur en vérifiant le statut du service mysql
name__
Sudo systemctl status [pattern]
Dans notre cas, nous voulons voir si mysql est en cours d'exécution, alors nous pouvons taper
systemctl status mysql.service
Vous devriez voir cette sortie si le service est en cours d'exécution
systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2017-01-10 23:10:06 EST; 1h 3min ago
Main PID: 1206 (mysqld)
CGroup: /system.slice/mysql.service
└─1206 /usr/sbin/mysqld
Remarque: Si le service est inactif, un message court indiquant qu'aucun service portant ce nom n'est en cours d'exécution, puis passez à l'étape 3.
2) Arrêt du service mysql
à l'aide de systemctl
name __
Remarque: [modèle] doit être le nom indiqué par service
ou initctl
name__. La raison pour laquelle j’utilise pattern
est parce que systemctl
utilise la correspondance des expressions rationnelles, aussi soyez prudent si vous devez utiliser l’argument kill
name__.
Sudo systemctl stop [pattern]
où pattern
représente le démon/nom de service mysql. si stop ne fonctionne pas essayer
Sudo systemctl kill [pattern]
Par exemple
Sudo systemctl stop mysql
3) Désinstallation/purge mysql
name __
si vous devez purger totalement, assurez-vous d'abord que le service ou le processus est arrêté, puis assurez-vous de supprimer les fichiers et les répertoires appropriés!
Remarque: Assurez-vous de cibler la version correcte mysql
name__. Par exemple, si vous utilisez la version 5.5, ajustez le numéro de version de manière appropriée.
AVERTISSEMENT: les étapes suivantes vont supprimer vos données! (la première commande doit être exécutée pour faire une sauvegarde)
source: Comment désinstaller MySQL?
tar -zcvf ~/msql_backup.tar.gz /etc/mysql /var/lib/mysql
Sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-5.7 mysql-client-core-5.7
Sudo rm -rfv /etc/mysql /var/lib/mysql
Sudo apt autoremove
Sudo apt autoclean
4) Corriger les paquets cassés et gérer les dépendances manquantes
Si les étapes précédentes n'ont pas fonctionné pour vous, vous devrez peut-être exécuter apt
avec l'option --fix-broken
pour réparer les dommages causés.
Assurez-vous d'abord de apt update
puis de apt install
Sudo apt update
Sudo apt install mysql-server mysql-client --fix-broken --fix-missing
5) Quand tout échoue, construisez et installez vous-même mysql
Si rien de ce qui précède ne fonctionne, vous devrez télécharger manuellement le code source, le compiler et utiliser make ou bash pour l'installer à partir de cet emplacement (moins douloureux qu'il n'y paraît, car tout est automatisé).
Le problème avec le premier post est que vous ne pouvez pas reconfigurer un méta-paquet, pas pour les éléments SQL. Vous devez spécifier l'élément de la version actuelle.
Dites utiliser;
apt search mysql-server
Cela devrait afficher une liste de paquets à savoir
"mysql-server-5.7" "mysql-server-core-5.7" ou versions ultérieures
puis;
dpkg-reconfigure --force mysql-server-5.7 mysql-server-core-5.7
terminé.
C'est la bonne solution pour vous
Tout d’abord, vous devrez supprimer tous les paquets de mysql-server:
ATTENTION: les étapes suivantes vont supprimer vos données! Faites d'abord une sauvegarde!
Sudo rm -rf /var/lib/mysql
Puis installez:
Sudo apt-get install lamp-server^
Ou tu peux faire:
Sudo apt-get install mysql-server
Cette erreur s'est également produite lors du passage de MySQL à MariaDB ( https://bugs.launchpad.net/ubuntu/+source/mysql-5.7/+bug/1490071 ).
Les fichiers de données binaires MySQL n’étaient pas compatibles avec MariaDB. Je suis donc retourné à MySQL car je n’ai pas eu le temps de jouer à mysqldump.
J'ai d'abord dû déplacer les données MariaDB de /var/lib/mysql
, puis installer MySQL, puis déplacer mes données d'origine de /var/lib/mysql-5.7
(cette sauvegarde a été créée automatiquement avant l'erreur) vers /var/lib/mysql
.
J'ai vu ça
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
comme indice qu'il y avait toujours un script de démarrage erroné.
Recherchez /etc/init.d/mysql
et ses liens symboliques. Le fait de les supprimer semble résoudre mes problèmes de réinstallation après la purge.