当前位置: 首页>>技术问答>>正文


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线程中的一个有用的帖子拼凑在一起。

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

  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文件藏在其他地方(我在我的主目录中)或/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开始。

这有效!

次佳解决思路

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

第三种解决思路

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

I can understand the pain of having your system in inconsistent state but lets not worry about the whole situation and take it step by step to get the system clean.

First lets see the current state of all the mysql packages on machine using: dpkg -l | grep mysql (Please paste the output excluding last column)

The first column denotes the current status of the package. Here are the possible options:

ii) Installed rc) Removed config-files kept (This should be the state of all the packages you have removed with ‘apt-get remove’ that does not remove config-files under /etc)

For this to work, you will need to run ‘apt-get purge ‘ till you do not see any packages in the above list.

Please remember that some non-mysql-server packages like python-mysql.connector and python-mysqldb, if installed, need not be removed as they do not have any affect on this situation but if removed might cause trouble to applications using them.

We will definitely try to re-visit our docs to see how can we safeguard users from getting into this trouble. Thanks for sharing your feedback in detail with us.

第四种思路

你的错误信息包含这一行:

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(–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移动到另一个驱动器。然后,在postinst脚本操作之前,您可能需要暂时删除符号链接。然后re-create运行包升级后。

在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

有关更多详细信息,请参阅我的answer(由ChristophS提供),位于计算器上。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/554.html,未经允许,请勿转载。