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

我在这里也遇到了同样的问题:http://serverfault.com/questions/772302/ubuntu-upgrade-from-14-04-lts-to-16-04-failed-mysql-server-5-7-dependecies-fai?noredirect=1#comment973882_772302。 - KernelPanic
1不得不卸载phpmyadmin,它以某种方式引起了依赖问题。重新安装后,一切都恢复正常了。 - Hinrich
1从Ubuntu 14升级到16的do-release-upgrade执行了一个不受支持的MySQL 5.5到5.7的升级,因此预计在升级后MySQL会出现故障,如此处所报告的:https://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+bug/1725222 - Marco Marsala
1@MarcoMarsala 我不知道我们是否可以说在Ubuntu 14升级到16之后MySQL出现故障是“预料中的”,尽管我认为这取决于你的观点。对于普通用户来说,肯定不会预料到LTS升级会破坏像MySQL这样的东西。然而,在测试期间没有发现这一点确实令人惊讶。 - TheGremlyn
安装phpmyadmin --reinstall修复了上述问题,不需要再操作mysql... 怪事 - Andy
10个回答

@andrew-beerman发布的指示基本正确,尽管对我来说不太清楚,并且似乎推荐了比必要的更多的步骤。我从上面的内容和错误线程中的一篇有帮助的帖子中整理出了答案。
以下是我纠正此问题所采取的步骤:
  1. 备份位于/etc/mysql下的my.cnf文件,然后将其删除或重命名:
  2. sudo mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
    
  3. 使用以下命令删除文件夹/etc/mysql/mysql.conf.d/
  4. sudo rm -r /etc/mysql/mysql.conf.d/
    
  5. 确保没有其他地方存放my.cnf文件(比如在用户主目录下)或/etc/alternatives/my.cnf中存在,可以使用以下命令进行查找:
  6. sudo find / -name my.cnf
    
  7. 备份并删除/etc/mysql/debian.cnf文件(不确定是否需要,但以防万一):
  8. 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
    
  9. 如果系统日志显示类似"mysqld: Can't read dir of '/etc/mysql/conf.d/'"的错误,请创建一个符号链接:
  10. sudo ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
    

    然后可以使用sudo service mysql start启动服务。

搞定了!

20经过所有这些操作(我之前做过),我仍然遇到相同的错误问题... - Serge P
你确定你删除了所有的配置文件吗?我在一个用户文件夹里发现了一个名为my.cnf的文件,似乎阻止了完全清除。 - TheGremlyn
是的,我确定,顺便说一句,我有更新版本的my.cnf文件,没有旧的语法。无论如何,我通过安装MariaDB服务器解决了这个问题。 - Serge P
5你需要从/etc/mysql目录中删除所有的my.cnf.*文件。同时,还要删除my.cnf.backup、my.cnf.fallback和my.cnf.migrated这些文件(先备份!)。 - hitzi
8@SergiiP sudo find / -name "my.cnf"可能会派上用场。 - starbeamrainbowlabs
1mysql-server-core- 应该是 mysql-server-core-5.7。除此之外,一切都运行得很顺利。谢谢! - David Tay
1+1。你真是让我开心!不仅仅是早上和晚上!我之前卡住了。 - Max Yudin
非常感谢!这些步骤成功修复了我的损坏的MySQL。对于我来说,使用"mysql-server-core",apt会自动处理成mysql-server-core-5.7。 - Thomas Carlisle
尝试了很多次这个解决方案后,我决定备份/etc/mysql文件夹然后将其删除。重新安装了mysql,并按照这里描述的步骤进行操作,一切都正常工作了! - skonsoft
1我遇到了 mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 的问题,并在之后的清除和安装步骤中重试了 sudo mkdir /etc/mysql/conf.d/; sudo chown -R mysql:mysql /etc/mysql/conf.d,成功解决了该问题。 - Jonathan
1sudo apt-get remove --purge mysql-server mysql-client mysql-commonsudo rm -rf /var/lib/mysql - Spl2nky
我只需要移除mysql-common(同时要小心不要移除mariadb-common),这样就可以摆脱无效的my.cnf文件了。 - pwned
我知道这个问题应该是一个旧的错误,但我今天(2017年4月2日)遇到了这个问题。所以我尝试了上面接受的答案。一开始看起来效果不错,直到最后出现了以下错误:ERROR: 无法启动MySQL服务器:mysqld: 无法读取目录'/etc/mysql/mysql.conf.d'(错误代码:13 权限被拒绝)[ERROR] 默认处理中的致命错误。请问有什么建议吗? - Purvez
抱歉,我应该说一下我的错误似乎与之前评论中提到的无法读取conf.d目录的错误略有不同。 - Purvez
我再次尝试了整个过程,这次却出现了错误代码2,指向/etc/mysql/conf.d。所以我创建了符号链接并尝试重新启动mysql服务,但是任务失败了。很遗憾,我现在感到非常沮丧。 - Purvez
安装mysql-server时(最后一步),它抱怨我没有my.cnf.fallback,所以我根据这个链接https://askubuntu.com/a/865931/77700创建了一个,并再次触发了命令,然后它开始工作了。 - Thai Tran
这是否是在移除可能存在的数据库模式? - frandevel
您的数据库应该保持完整,但备份它们始终是个好主意。 - TheGremlyn
1这解决了我的问题,所有数据库还在,谢谢。 - reignsly
做完所有这些之后,我遇到了一个MySQL的“访问被拒绝”错误。我通过这个答案解决了这个问题。现在一切都恢复正常了!:-D - Stack Underflow

今天我遇到了同样的问题,尝试了很多解决方案后,发现问题出在我使用的命令sudo systemctl disable mysql.service上,这个命令用于禁用MySQL的自动启动。所以为了让它正常工作,我重新启用了MySQL服务器,使用命令sudo systemctl enable mysql.service,然后再次运行升级过程,结果顺利完成。

7我遇到了同样的问题,同样的解决方法对我也起作用。 - Allen
6对我有用。在这里试了每个解决方案,mysql在这个之后就正常工作了。 - Błażej Michalik
7一样啊 - 这个应该是置顶帖。 - a1phanumeric
5对我也起作用了!非常感谢。只是为了明确起见,请运行:sudo systemctl enable mysql.service,然后再运行sudo apt install -f - Fernando Paladini
这就是我需要做的全部。我像@naruto所描述的那样禁用了自动启动。我启用了自动启动并运行了"sudo apt upgrade"。现在问题已解决。应该是最佳答案。这是一个更简单、更标准且不易出问题的解决方案。 - Jack Holt
在尝试了许多不同的解决方案和浏览了很多网站之后,终于找到了能够解决我的问题的方法。 - Jenson Jose
这个解决方案完美地起作用了 :-) - Aang
这应该是被选中的答案。 - Fran Marzoa
它解决了 OP 的 bug,但问题是,你会发现有一个 mysqld 服务器一直在后台运行。也许你不希望这样。我要尝试再次禁用它... - PlasmaBinturong
通常这种情况发生在您禁用了MySQL并且停止使用它的虚拟机/服务器上。当您升级并且MySQL也被设置为升级时,它会尝试连接到MySQL服务器以执行升级指令。但由于找不到正在运行的实例,它会失败,并且不足够智能以启用mysql - 运行它 - 执行升级 - 再次禁用它或者提供一个有意义的提示信息。 - Angsuman Chakraborty

您的错误信息包含了这一行:
subprocess installed post-installation script returned error exit status 1

然而,这个“已安装后安装脚本”没有具体指明其名称。经过许多尝试,我发现它的名称是(在我的情况下)“/var/lib/dpkg/info/mysql-server-5.7.postinst”。
用“sudo vi /var/lib/dpkg/info/mysql-server-5.7.postinst”或您喜欢的编辑器打开此文件。
在顶部修改第3行(大约如此):“set -e”改为“set -x”,保存文件。(选项“-e”表示“出现错误即退出”,“-x”表示“显式显示执行的命令”,推测如此)
运行“sudo dpkg --configure -a --log /tmp/dpkg.log” (“--log”选项是可选的)。如果您知道它将是唯一一个需要升级的软件包,您也可以直接运行“apt upgrade”。
现在,你会得到“mysql-server-5.7.postinst” bash 脚本的详细输出,从中你可以找出问题所在。
在我的情况下,它尝试无效地运行mysql_upgrade(重新运行),但对于我定制的mysql安装来说是不需要的。我确信之前已经成功手动运行过它,并且一切都很好。
所以我注释掉了第321行(对于较旧的mysqld版本,请尝试第281行):
#mysql_upgrade --defaults-file=/etc/mysql/debian.cnf || result=$?
然后之前失败的命令sudo apt upgrade(再次运行)成功完成,并且dpkg移除了此软件包的错误状态。
现在你可以将set -x设置回set -e(如上所述)。如果需要,可以取消注释mysql-upgrade行。
如果您将mysql数据分区移动到非标准位置,则可能需要额外的工作。我通过符号链接将我的数据从/var/lib/mysql/data移动到另一个驱动器。然后在运行软件包升级之前,您可能需要暂时删除符号链接。然后在重新创建它后运行软件包升级。
在mysqld debian软件包的下一个小版本升级之后,这个与/var/lib/dpkg/info/mysql-server-5.7.postinst脚本相关的问题可能会再次出现。

我最后决定清除所有内容,然后从这里下载社区版的mysql-server,并手动安装:http://dev.mysql.com/downloads/mysql/ - RyanNerd
发生了完全相同的事情,而且你的步骤也解决了它。但对我来说,我的mysql_upgrade调用在第320行。你能解释一下为什么从postinst脚本调用时会返回一个非零值吗? - emiliopedrollo
@emiliopedrollo 不好意思,我不能在这里解释。但是我认为行号现在是320,因为最近软件包维护人员增加了postinstall脚本。前几天我也观察到了同样的情况,在软件更新器的最后一次运行中(其中包括一个新的mysql-deb包)。 - knb
谢谢!通过使用set -e,我成功找出了问题所在——MySQL没有为/etc/mysql/debian.cnf中指定的Ubuntu系统用户提供访问权限。因此,我将该用户添加到MySQL并授予权限,然后再次运行dpkg,问题得以解决! - Allen Hamilton

这里的说明解决了我的服务器问题:https://bugs.mysql.com/bug.php?id=72722
我能理解系统处于不一致状态时的痛苦,但是让我们不要担心整个情况,逐步清理系统。
首先,让我们查看机器上所有mysql软件包的当前状态,使用命令:dpkg -l | grep mysql(请粘贴输出,不包括最后一列)。
第一列表示软件包的当前状态。以下是可能的选项:
ii) 已安装 rc) 已删除但保留配置文件(这应该是您使用'apt-get remove'删除的所有软件包的状态,在/ etc目录下不会删除配置文件)
为了使其工作,您需要运行'apt-get purge ',直到在上述列表中看不到任何软件包为止。
请记住,一些非mysql-server软件包,如python-mysql.connector和python-mysqldb,如果已安装,则不需要删除,因为它们对此情况没有影响,但如果删除可能会给使用它们的应用程序带来麻烦。
我们一定会重新查阅我们的文档,看看如何保护用户免受此类麻烦的影响。感谢您详细与我们分享反馈。

2感谢使用 dpkg -l | grep mysql。这对于理解方向有所帮助。 - Max Yudin
命令错误,清除应该是 sudo apt-get purge <pkg-name>。我已经进行了编辑修正:我使用了Unicode字符来表示 <,否则它将无法显示。请注意复制粘贴此命令。 - Toskan

在我的情况下,通过使用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又恢复正常了 :)

我建议您将以下代码添加到 /usr/share/mysql/mysql-systemd-start 的第25行开始,这样您就不必在每次重启后重新创建此目录(抱歉,此评论中的换行符无法正常显示):if [ ! -d /run/msyqld ]; then mkdir -p -m0755 /run/mysqld || { echo "无法创建 /run/mysqld"; exit 1; } chown mysql:mysql /run/mysqld || { echo "无法更改 /run/mysqld 的所有者"; exit 1; } fi - scoobydoo

在我的情况下,我可以通过添加来解决这个问题。
# Allow log file access
/home/system/var/log/mysql.err rw,
/home/system/var/log/mysql.log rw,
/home/system/var/log/mysql/ r,
/home/system/var/log/mysql/** rw,

/etc/apparmor.d/local/usr.sbin.mysqld

要了解更多详情,请查看我在stackoverflow上的答案(作者:ChristophS)。


我遇到了同样的问题。我尝试了多次重新安装MySQL,但都没有成功。

后来我发现问题在于另一个MySQL进程已经在运行。

详细情况如下:

在我仔细阅读了/var/log/mysql/error.log中的日志后,我找到了以下内容:

[ERROR] 无法启动服务器:绑定到TCP/IP端口:地址已在使用中

[ERROR] 您是否已经在端口3306上运行另一个mysqld服务器?

看起来另一个应用程序已经在使用该端口。

我使用ps -aux | grep 3306进行了检查:

$ ps -aux | grep 3306
milkovs+  6802  0.0  0.0  16336  1084 pts/19   S+   21:39   0:00 grep --color=auto 3306
mysql    14706  0.0  0.3 1270192 13916 pts/2   Sl   Aug19   0:29 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=

我杀死了正在运行的进程sudo kill -15 14706

然后我启动了mysql:/etc/init.d/mysql start

最后mysql对我有效!希望能对别人有所帮助。


对于WSl Ubuntu 16.04版本,我找到了这篇有用的文章在这里

解决步骤如下:

  1. sudo vi /var/lib/dpkg/info/mysql-server-5.7.postinst
  2. 查找以下行:mysql_upgrade --defaults-file=/etc/mysql/debian.cnf || result=$?
  3. 在第2行上方直接添加:service mysql restart
  4. 保存并运行:sudo dpkg --configure -a

最终结果应该如下所示:

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

希望这能帮到你。

我现在的几台服务器上都遇到了这个问题 解决方法是运行 apt install phpmyadmin --reinstall
这样就解决了上述问题(无需后续操作mysql)

这个页面上的所有答案对我都没用。
最后我去了Oracle下载页面,下载了mysql-apt-config_0.8.8-1_all.deb,然后从Oracle仓库安装了MySQL。
sudo dpkg -i mysql-apt-config_0.8.8-1_all.deb
sudo apt update
sudo apt install mysql-server

2isntall -> install 是一个拼写错误。愚蠢的SO不允许我更正一个字符。 - Csaba Toth
你为什么去Oracle下载MySQL? - Sinscary
@Sinscary 这个回答是一段时间以前的,但可能是因为他们有比系统包管理器更新的版本? - ostrokach