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

@ andrew-beerman发布的说明在正确的轨道上,虽然它们对我来说不是很清楚,似乎推荐的不仅仅是必要的。 我拼凑了上面的答案和bug线程中的一个有用的post。

这些是我为纠正这个而采取的步骤:

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

     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文件(我在家里做了dir!)或在/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. 如果您的syslog显示错误,例如“mysqld:无法读取’/etc/mysql/conf.d/’的dir”,请创建一个符号链接:

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

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

这让它运作了!

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

这里的说明修复了我的服务器: 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(如果已安装)无需删除,因为它们对这种情况没有任何影响,但如果删除可能会给使用它们的应用程序带来麻烦。

我们一定会尝试重新访问我们的文档,看看我们如何保护用户免受此问题的困扰。 感谢您与我们分享您的反馈意见。

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

 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 -e set -x ,保存文件。 (选项-e是“退出错误”, -x表示“显式显示命令已执行”,大概是)

运行sudo dpkg --configure -a --log /tmp/dpkg.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 -eset -e (如上所述)。 并且可以选择取消注释mysql-upgrade行。

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

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

在我的情况下,使用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再次工作:)

在我的情况下,我可以通过添加解决问题

 # 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提供)。

本页面上的所有答案都不适合我。

我最终进入Oracle下载页面 ,下载mysql-apt-config_0.8.8-1_all.deb ,并从Oracle repo安装MySQL:

 sudo dpkg -i mysql-apt-config_0.8.8-1_all.deb sudo apt update sudo apt install mysql-server 

我遇到过同样的问题。 我试过几次重新安装mysql,但没有成功。

我发现对我来说问题是,另一个mysql进程已经运行了。

详情如下:

我仔细阅读了/var/log/mysql/error.log日志后发现:

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

[错误]你是否已在端口上运行另一个mysqld服务器:3306?

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

我用ps -aux | grep 3306检查了它 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适合我! 我希望它对某人有所帮助。