Ubuntu 18.04 LTS升级至20.04 LTS时MySQL服务器平滑迁移方案问询
Ubuntu 18.04 LTS升级至20.04 LTS时MySQL服务器平滑迁移方案问询
我完全懂你的无奈——从Ubuntu 18.04升级到20.04时MySQL故障的问题确实在社区里随处可见,很多人都找不到明确的解决方案,你之前折腾一天最后回滚的经历太折腾了,还好有VPS快照备份兜底,这点真的要反复敲黑板提醒所有人!
下面是一套经过验证的、能让MySQL在系统升级过程中平滑过渡的步骤,分阶段帮你避开坑:
一、升级前的核心准备工作(绝对不能省)
- 单独备份MySQL全量数据:别只依赖VPS快照,单独导出MySQL所有数据是双重保障。执行以下命令:
输入MySQL root密码后,会生成包含所有数据库、用户权限、存储过程、触发器的备份文件,把它下载到本地或者其他安全存储位置。mysqldump -u root -p --all-databases --flush-privileges --routines --triggers --events > full_mysql_backup_$(date +%Y%m%d).sql - 确认当前MySQL版本:Ubuntu 18.04默认搭载MySQL 5.7,而20.04默认是MySQL 8.0,两者有关键兼容性差异(比如默认认证插件从
mysql_native_password改为caching_sha2_password),提前明确这点能避免后续踩坑。 - 把现有MySQL更到最新补丁版:升级系统前先把当前MySQL的所有更新包打满,减少版本断层风险:
sudo apt update && sudo apt upgrade mysql-server mysql-client -y
二、系统升级过程中的MySQL专属操作
先完成常规系统更新,但临时锁定MySQL包避免自动升级:
sudo apt update && sudo apt upgrade -y # 标记MySQL相关包暂不升级,防止系统升级过程中强制替换版本 sudo apt-mark hold mysql-server mysql-client mysql-common执行Ubuntu发行版升级:
sudo do-release-upgrade⚠️ 关键提醒:升级过程中如果弹出是否替换MySQL配置文件(比如
my.cnf或mysql.cnf),一定要选择保留本地现有配置(keep the local version currently installed),不要直接用新的默认配置,否则会触发大量兼容性问题。系统升级完成后,解除MySQL锁定并适配20.04的MySQL 8.0:
sudo apt-mark unhold mysql-server mysql-client mysql-common # 安装20.04官方适配的MySQL 8.0包 sudo apt install mysql-server-8.0 mysql-client-8.0 -y运行MySQL官方升级工具,自动处理数据文件兼容性:
sudo mysql_upgrade -u root -p输入MySQL root密码后,工具会自动检查并升级MySQL 5.7的数据文件,使其适配8.0的存储格式,这一步是确保数据能正常读取的关键。
三、升级后的验证与兼容性适配
- 检查MySQL服务状态:
如果输出显示sudo systemctl start mysql sudo systemctl status mysqlactive (running),说明服务已正常启动。 - 处理认证插件兼容问题:如果你的应用程序还在使用旧的
mysql_native_password认证方式,需要做以下适配:
方式一:全局修改默认认证插件(适合所有旧应用)
编辑MySQL配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段添加:
然后重启MySQL服务:default_authentication_plugin=mysql_native_password
方式二:单独修改特定应用用户的认证方式(更灵活)sudo systemctl restart mysql
登录MySQL后执行:ALTER USER 'your_app_username'@'your_app_host' IDENTIFIED WITH mysql_native_password BY 'your_user_password'; FLUSH PRIVILEGES; - 验证数据完整性:登录MySQL检查所有数据库是否正常,随便找个业务库执行查询语句,确认数据没有丢失或损坏:
执行mysql -u root -pSHOW DATABASES;确认库列表,再用USE your_database;+SELECT * FROM your_table LIMIT 10;验证数据可正常读取。
四、应急排查方案(如果升级后MySQL启动失败)
- 查看错误日志定位问题:
常见问题包括配置文件语法错误、数据文件权限问题、InnoDB日志格式不兼容等,日志会给出明确的错误提示。sudo tail -n 50 /var/log/mysql/error.log - 临时修复InnoDB启动故障:如果是InnoDB日志兼容性问题,可以临时修改配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段添加:
启动MySQL成功后,再移除这个参数,重新运行innodb_force_recovery = 1sudo mysql_upgrade -u root -p修复数据。
备注:内容来源于stack exchange,提问作者João Pimentel Ferreira




