16.04 升级导致 mysql-server 崩溃

16.04 升级导致 mysql-server 崩溃

我的整体升级进展顺利,但留下一个严重的问题,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)

我尝试过完全删除它,但由于依赖关系,这样做会尝试安装 MariaDB (?)。任何关于如何修复此问题的建议我都会非常欢迎。

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

答案1

@andrew-beerman 发布的说明是正确的,尽管它们对我来说不太清楚,而且似乎推荐了不必要的内容。我把上面的答案和 bug 帖子中的一篇有用的帖子拼凑在一起。

以下是我纠正此问题所采取的步骤:

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

    sudo mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
    
  2. /etc/mysql/mysql.conf.d/使用删除文件夹

    sudo rm -r /etc/mysql/mysql.conf.d/
    
  3. 确认你没有my.cnf将文件存放在其他地方(我的是存放在主目录中!)或正在/etc/alternatives/my.cnf使用中

    sudo find / -name my.cnf
    
  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
    
  5. 如果您的系统日志显示类似“mysqld:无法读取‘/etc/mysql/conf.d/’目录”的错误,请创建一个符号链接:

    sudo ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
    

    然后该服务应该能够启动sudo service mysql start

它开始工作了!

答案2

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

答案3

您的错误消息包含此行:

subprocess installed post-installation script returned error exit status 1

但是,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如果您知道它是唯一需要升级的包,您也可以直接运行。

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

就我而言它尝试(重新)运行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脚本的问题可能会再次出现。

答案4

就我而言,使用 strace 后,我发现 /var/run/mysqld/ 不存在,并且 mysqld 无法创建文件 mysqld.sock。

这些命令解决了我的问题:

mkdir /var/run/mysqld
chown mysql.mysql /var/run/mysqld
chmod 700 /var/run/mysqld

现在:

systemctl start mysql

mysql 又能正常工作了 :)

相关内容