Ubuntu 18.04 LTS升级至22.04 LTS并保留指定包的问题及升级状态验证
嗨,我来帮你一步步梳理这个问题的解决思路和验证方法,咱们先搞定当前20.04的不完整升级,再确认状态,最后顺利升到22.04并保住MySQL 5.7。
一、先修复当前20.04的不完整升级状态
你遇到的那些“No candidate ver”错误,是因为这些包在Ubuntu 20.04的官方源里已经找不到了——比如旧的Azure内核版本、PHP7.2(20.04默认是PHP7.4)、还有旧的python包(20.04里默认用python3,python包已经被废弃)。咱们得先把这些“孤儿包”处理掉,才能继续升级:
移除那些没有候选版本的包:
sudo apt remove libapache2-mod-php7.2 linux-image-5.4.0-1032-azure linux-image-5.4.0-1095-azure linux-modules-5.4.0-1032-azure linux-modules-5.4.0-1095-azure linux-modules-extra-5.4.0-1032-azure linux-modules-extra-5.4.0-1095-azure python执行的时候如果提示确认,直接回车就行。
修复依赖关系,确保系统没有损坏的包:
sudo apt --fix-broken install更新源并完成当前系统的所有升级:
sudo apt update && sudo apt upgrade -y
二、验证系统是否真的完成了20.04的升级
光看lsb_release -a是不够的——有时候升级过程中版本文件会被提前更新,但系统组件还没完全升级。咱们得做几个更靠谱的检查:
检查已安装包的发行版适配性:
运行下面的命令,查看有没有不属于20.04(代号focal)的包:sudo apt list --installed | grep -v focal如果输出大量非focal的包,说明升级还没完成,得回到第一步继续修复。
查看升级日志:
检查发行版升级的详细日志,看看有没有未完成的步骤或错误:cat /var/log/dist-upgrade/main.log日志里会记录升级过程中的每一步,如果有失败的操作,会明确标注出来。
检查内核版本:
Ubuntu 20.04的默认内核是5.4.x系列(后期会更新到更高的稳定版),如果你的内核还是18.04的4.15.x,说明内核没升级成功:uname -r检查系统底层库版本:
20.04的glibc版本是2.31,而18.04是2.27,这个可以验证底层系统是否真的升级了:ldd --version
三、升级到22.04 LTS并保留MySQL 5.7
要注意的是,Ubuntu 22.04的官方源里默认是MySQL 8.0,没有5.7的包,所以咱们得提前做配置,防止MySQL被自动升级,同时确保升级后还能正常运行5.7:
先备份MySQL数据!
这一步绝对不能省,万一升级出问题,数据是最关键的:sudo mysqldump -u root -p --all-databases > all_databases_backup.sql执行后输入MySQL root密码,等待备份完成。
锁定MySQL 5.7的版本
编辑apt的偏好文件,让系统优先保留5.7版本,不自动升级到8.0:sudo nano /etc/apt/preferences.d/mysql-5.7.pref粘贴下面的内容,然后按
Ctrl+O保存,Ctrl+X退出:Package: mysql-server mysql-client mysql-common mysql-community-server mysql-community-client Pin: version 5.7.* Pin-Priority: 1001添加MySQL官方源获取5.7包
因为22.04官方源没有5.7,所以要添加MySQL官方的源:wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb安装过程中会弹出配置界面,选择
MySQL Server & Cluster,然后选择5.7版本,最后确认配置即可。更新源并开始升级到22.04
sudo apt update sudo apt install update-manager-core sudo do-release-upgrade升级过程中如果提示是否替换配置文件(比如
my.cnf),一定要选择保留当前版本,避免覆盖MySQL 5.7的配置。升级完成后验证MySQL状态
重启系统后,检查MySQL是否正常运行:sudo systemctl status mysql再登录MySQL确认数据没问题:
mysql -u root -p
备注:内容来源于stack exchange,提问作者Nick gia

