升级 mysql-server-5.1 时 apt-get 挂起

升级 mysql-server-5.1 时 apt-get 挂起

当我尝试执行以下操作时:

sudo apt-get update
sudo apt-get upgrade

在我的 Ubuntu Server 10.04 安装中,它挂在以下行:

Preparing to replace mysql-server-5.1 5.1.41-3ubuntu12.1 (using .../mysql-server-5.1_5.1.41-3ubuntu12.3_i386.deb)

我甚至无法按 CTRL-C 退出!我最终不得不终止会话并从其他终端登录,但升级过程仍在运行。我重启了几次,当我返回并再次尝试时,它告诉我:

E: dpkg was interrupted, you must manually run 'sudo --configure -a' to correct the problem.

一旦我这样做,我就会回到原点,并且当我尝试升级 mySQL 时它会冻结。

答案1

备份数据库后,尝试进入低于 apt 的级别:

sudo dpkg -r mysql-server
sudo apt-get check    # verify that apt's metadata is okay
sudo apt-get install mysql-server

添加

由于dpkg -r令人窒息的尝试dpkg --purge失败了,用 zap 获取包装内容dpkg -L mysql-server-5.1,然后在里面乱搞/var/lib/dpkg

抱歉,我从没见过事情变得这么棘手。

如果你一开始没有成功

我有点想歪了,请原谅。mysql-server 元包包含或需要以下包:

libdbd-mysql-perl
libdbi-perl
libhtml-template-perl
libnet-daemon-perl
libplrpc-perl
mysql-client-5.1
mysql-client-core-5.1
mysql-server
mysql-server-5.1
mysql-server-core-5.1

包管理的元数据被很好地解耦了,虽然有中央存储库,但包都是独立的。/var/cache/apt/archives*.deb已安装文件所在的位置。

首先,强制 dpkg 忘记这些包(无论如何我们都会面临无法删除一些我们要替换的文件的风险)。

for i in mysql-server-core-5.1 mysql-server-5.1 ... ; do
    sudo dpkg -r --force-remove-reinstreq $i
done

然后获取完整安装所需的 .deb 文件:

sudo apt-get install --download-only mysql-server

然后尝试逐个安装它们:

cd /var/cache/apt/archives
sudo dpkg -i mysql-server-core-5.1_5.1.41-3ubuntu12.3_i386.deb

如果您遇到问题,请尝试:

sudo dpkg -D77777 -i mysql-server-core-5.1... > 2>&1 /tmp/dpkg.log.$$

尝试从日志文件中找出无数行相关内容,并将它们发布到这里。祝你好运,一路顺风。

答案2

显然,更新正在等待服务器启动,但由于某种原因,服务器没有启动。要解决这个问题,有几种可能的方法。

最简单的:

  1. 打开一个新终端并运行:

    sudo services mysql start
    

更复杂但有时是必要的:(当您无法访问其他终端时这很方便):

  1. 按“^z”(Ctrl+ Z)将“停止”您的工作。然后运行:

    sudo services mysql start
    
  2. 服务器启动后,输入以下内容并按 Enter:

    fg 
    

    这会将您的“已停止”作业放回到前台并从其停止的地方继续。

答案3

我遇到这个问题是因为它是虚拟机的副本,所以我更改了服务器的 IP 地址,但没有更改 my.cnf 文件中的绑定地址。一旦我将绑定地址更改为匹配,更新就不会挂起并成功完成。

答案4

我遇到了同样的问题,但现有的解决方案似乎都不合适。在任何 *nix 上强制卸载都是不必要的,而且绝对不是 KISS。就我而言,我发现原因很简单。MySQL 拒绝启动,因为它仍在运行!当 apt 尝试停止 MySQL 时,它处于活动状态并且从未真正停止。

与往常一样,请确保您有备份!

停止服务:

sudo service mysql stop

确保该服务不再运行:

sudo ps ax | grep mysql

如果它仍在运行,请给它一些时间:

sudo kill <pid>

但最终,如果仍然奔跑,你必须积极地杀死它:

sudo kill -9 <pid>

一旦确认它不再运行,您就可以继续更新。

更新完成后,尤其是如果您必须 kill -9 时,请务必运行 mysqlcheck 以确保导致服务无法停止的原因不是损坏或损坏的表。还要确保您有定期备份(并确保这些备份确实有效!)。

相关内容