这是我个人疏忽造成的令人沮丧的问题。我在mysql-server-8.0
笔记本电脑上安装时忘记了安装了 MariaDB 实例。不幸的是,这似乎完全破坏了 apt。apt update
按预期工作,但是apt install
,,,apt autoremove
等apt 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
脚本的第二行(如果存在)。你的情况很可能是:
/var/lib/dpkg/info/mysql-server-8.0.prerm
/var/lib/dpkg/info/mysql-server-8.0.postrm
在某些罕见情况下,您也必须在这些脚本中执行此操作:
/var/lib/dpkg/info/mysql-server-8.0.preinst
/var/lib/dpkg/info/mysql-server-8.0.postinst
参见维护者脚本的流程图:维护者脚本流程图
之后apt autoremove
运行应该不会出现错误。但这不会像软件包开发人员希望的那样删除所有内容。它只是满足dpkg
于无错误运行。