我意外安装了 MySQL + MariaDB--MySQL 现在无法删除,并且 dpkg/apt 不起作用

我意外安装了 MySQL + MariaDB--MySQL 现在无法删除,并且 dpkg/apt 不起作用

这是我个人疏忽造成的令人沮丧的问题。我在mysql-server-8.0笔记本电脑上安装时忘记了安装了 MariaDB 实例。不幸的是,这似乎完全破坏了 apt。apt update按预期工作,但是apt install,,,apt autoremoveapt remove返回类似于下面的内容。

root@xxx:/var/cache# sudo apt autoremove
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up mysql-server-8.0 (8.0.29-0ubuntu0.20.04.3) ...
Failed to stop mysql.service: Unit mysql.service not loaded.
invoke-rc.d: initscript mysql, action "stop" failed.
update-alternatives: error: alternative path /etc/mysql/mysql.cnf doesn't exist
dpkg: error processing package mysql-server-8.0 (--configure):
 installed mysql-server-8.0 package post-installation script subprocess returned
 error exit status 2
Errors were encountered while processing:
 mysql-server-8.0
E: Sub-process /usr/bin/dpkg returned an error code (1)

mysql-server 显然已安装,但输出autoremove显示找不到该服务。这意味着停止、启动、重新启动和重新加载该服务都无济于事,因为它根本就不存在。

此时我不知道该怎么做。有没有办法不用 apt 手动删除包?任何帮助都将不胜感激。

答案1

抱歉,我没有足够仔细地阅读这个问题。

不会apt-get autoremove尝试删除mysql-server-8.0。在发现没有要删除的内容后,它会尝试配置处于“config”状态的包(在您的情况下是)mysql-server-8.0。现在取决于具体处于哪个状态。

维护者脚本流程图

与往常一样,请确保您有一个备份和恢复数据库的计划,以防万一!

在大多数情况下,此命令应该有帮助:dpkg -P mysql-server-8.0

如果此操作不起作用,则安装处于执行preinst和/或postinst脚本的阶段。在这种情况下,可以使用下面的解释,但要使用/var/lib/dpkg/info/mysql-server-8.0.preinst/var/lib/dpkg/info/mysql-server-8.0.postinst脚本。


抱歉,目前我认为这不适合这个问题,但我会保留它以防万一或其他人遇到并需要它。

如果没有更深入的知识,你所做的一切都可能引发更多问题。如果你不详细了解你的系统,我只能给你一些提示,其中一些可能不是最佳的。但让我们试试吧……

您必须满足“dpkg”才能从(卸载)安装脚本中获取无错误。这可以通过多种方式实现。

最好的办法是让系统处于脚本无错误运行的状态。这很难,因为它需要一步一步地进行。

查看软件包的prerm脚本postrm,并尝试了解各个步骤,尤其是失败的步骤。将所有步骤落实到位,确保脚本运行无误。在某些情况下,唯一的方法可能是删除/注释包含失败命令的行(但请确保脚本 bash 语法正确)。

请参阅此内容以获得有关调试 Debian 软件包的帮助:http://mdcc.cx/debian/debugging_debian_package_installations.html

另一个“快速简便”的解决方案并不是最佳的,应该尽可能避免,如果没有其他帮助,只有最后一种解决方案:

添加exit 0脚本的第二行(如果存在)。你的情况很可能是:

  1. /var/lib/dpkg/info/mysql-server-8.0.prerm
  2. /var/lib/dpkg/info/mysql-server-8.0.postrm

在某些罕见情况下,您也必须在这些脚本中执行此操作:

  1. /var/lib/dpkg/info/mysql-server-8.0.preinst
  2. /var/lib/dpkg/info/mysql-server-8.0.postinst

参见维护者脚本的流程图:维护者脚本流程图

之后apt autoremove运行应该不会出现错误。这不会像软件包开发人员希望的那样删除所有内容。它只是满足dpkg于无错误运行。

相关内容