16.04 升级破坏了 mysql-server

The*_*lyn 134 upgrade mysql 16.04

我的整体升级进行得很顺利,但我留下了一个严重挥之不去的问题,即 mysql-server 无法自行安装,而且我没有尝试任何方法让它工作。

这是我在尝试安装/重新安装时看到的错误:

Setting up mysql-server-5.7 (5.7.11-0ubuntu6) ...
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.
                   Processing triggers for systemd (229-4ubuntu4) ...
Processing triggers for ureadahead (0.100.0-19) ...
Errors were encountered while processing:
 mysql-server-5.7
 mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
Run Code Online (Sandbox Code Playgroud)

我已经尝试完全删除它,尽管这样做会因为依赖关系(?)而尝试安装 MariaDB。任何关于我可以做些什么来解决这个问题的建议都将是最受欢迎的。

编辑:看起来我不是唯一一个:https : //bugs.launchpad.net/ubuntu/+source/mysql-5.7/+bug/1573279

The*_*lyn 130

@andrew-beerman 发布的说明走在正确的轨道上,尽管我不太清楚,而且似乎推荐了不必要的内容。我将上面的答案和错误线程中的有用帖子拼凑在一起。

这些是我为纠正此问题而采取的步骤:

  1. 备份您的my.cnf filein/etc/mysql并删除或重命名它

    sudo mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
    
    Run Code Online (Sandbox Code Playgroud)
  2. /etc/mysql/mysql.conf.d/使用删除文件夹

    sudo rm -r /etc/mysql/mysql.conf.d/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 确认您没有将my.cnf文件藏在其他地方(我在我的家庭目录中做过!)或正在/etc/alternatives/my.cnf使用

    sudo find / -name my.cnf
    
    Run Code Online (Sandbox Code Playgroud)
  4. 备份和删除/etc/mysql/debian.cnf文件(不确定是否需要,但以防万一)

    sudo mv /etc/mysql/debian.cnf /etc/mysql/debian.cnf.bak
    sudo apt purge mysql-server mysql-server-5.7 mysql-server-core-5.7
    sudo apt install mysql-server
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果您的系统日志显示类似“mysqld:无法读取 '/etc/mysql/conf.d/' 的目录”的错误,请创建一个符号链接:

    sudo ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
    
    Run Code Online (Sandbox Code Playgroud)

    然后服务应该能够以sudo service mysql start.

这让它工作!

  • 在所有这些操作之后(我之前做过)我仍然有同样的错误问题...... (20认同)
  • @SergiiP `sudo find / -name "my.cnf"` 可能会派上用场。 (8认同)
  • 您必须从 /etc/mysql 目录中删除每个 my.cnf.*。查找 my.cnf.backup、my.cnf.fallback 和 my.cnf.migrated - 所有这些文件也必须删除(先备份!) (5认同)

小智 62

今天我遇到了同样的问题,在尝试了许多解决方案后,我发现问题是sudo systemctl disable mysql.service我用来禁用 MySQL 自动启动的命令,所以为了让它工作,我使用该命令重新启用了 MySQL 服务器sudo systemctl enable mysql.service并再次运行升级过程和它完美地终止了。

  • 我遇到了同样的问题,同样的修复对我有用。 (7认同)
  • 同样在这里 - 这应该是顶级帖子。 (7认同)
  • 为我工作。在这里做了每一个解决方案,mysql 在这个解决方案之后工作。 (6认同)
  • 也为我工作!非常感谢。明确地说,运行:`sudo systemctl enable mysql.service`,然后运行`sudo apt install -f`。 (5认同)

knb*_*knb 21

您的错误消息包含以下行:

subprocess installed post-installation script returned error exit status 1
Run Code Online (Sandbox Code Playgroud)

然而,这installed post-installation script并没有被提及。经过多次修补,我发现它的名字是(就我而言)/var/lib/dpkg/info/mysql-server-5.7.postinst

使用sudo vi /var/lib/dpkg/info/mysql-server-5.7.postinst或您首选的编辑器打开此文件。

在顶部,将第 3 行(左右)更改set -eset -x,保存文件。(选项-e是“出错时退出-x”,大概意思是“显式显示执行的命令”)

运行sudo dpkg --configure -a --log /tmp/dpkg.log (--log 选项是可选的)。apt upgrade如果您知道它将是唯一要升级的包,您也可以简单地运行。

现在您获得了mysql-server-5.7.postinstbash 脚本的详细输出,您可以找出问题所在。

在我的情况下,它尝试(重新)运行失败mysql_upgrade,但我的自定义 mysql 安装不需要。我确信我以前手动运行过它,成功过,一切都很好。

所以我注释掉了第 321 行(对于较旧的 mysqld 版本,请尝试第 281 行),

#mysql_upgrade --defaults-file=/etc/mysql/debian.cnf || result=$?

和之前失败的命令,sudo apt upgrade(再次运行),成功完成,dpkg 删除了这个包的错误状态。

现在,您可以设置回set -xset -e(上述)。并可选择取消注释 mysql-upgrade 行。

如果您已将 mysql 数据分区移动到非标准位置,则可能需要额外的工作。我/var/lib/mysql/data通过符号链接将我的从另一个驱动器移到了另一个驱动器。然后,您可能必须在postinst脚本操作之前暂时删除符号链接。然后在运行包升级后重新创建它。

在mysqld debian 包的下一次次要版本升级后,/var/lib/dpkg/info/mysql-server-5.7.postinst脚本的这个问题会再次出现。


And*_*man 18

这里的说明在我的服务器上修复了它:https : //bugs.mysql.com/bug.php?id=72722

我可以理解让您的系统处于不一致状态的痛苦,但不要担心整个情况并逐步清理系统。

首先让我们使用以下命令查看机器上所有 mysql 包的当前状态: dpkg -l | grep mysql(请粘贴不包括最后一列的输出)

第一列表示包的当前状态。以下是可能的选项:

ii) 已安装的 rc) 已删除的配置文件保留(这应该是您使用 'apt-get remove' 删除的所有软件包的状态,该状态不会删除 /etc 下的配置文件)

为此,您需要运行“apt-get purge <pkg-name>”,直到在上面的列表中看不到任何包。

请记住,一些非 mysql-server 包,如 python-mysql.connector 和 python-mysqldb,如果安装了,不需要删除,因为它们对这种情况没有任何影响,但如果删除可能会给使用它们的应用程序带来麻烦。

我们一定会尝试重新访问我们的文档,看看我们如何保护用户免于陷入这种麻烦。感谢您与我们详细分享您的反馈。

  • 感谢`dpkg -l | grep mysql`. 它有助于理解方向。 (2认同)