不推荐在 Ubuntu 22.04 上离线部署 MySQL 8.0,除非严格网络隔离且接受高维护成本;apt install mysql-server 是最稳、省事、可持续的方式,离线安装易因依赖混乱、初始化缺失、服务单元缺失、AppArmor 配置错误等问题失败。

直接说结论:不推荐在 Ubuntu 22.04 上走离线部署 MySQL 8.0 的路,除非你明确被网络隔离、无法访问任何 apt 源(包括内网镜像),且已接受后续维护成本翻倍。apt install mysql-server 是默认源下最稳、最省事、最可持续的方式;所谓“离线安装”,实际是把 apt 的工作手动重做一遍,极易出错,且几乎无法回退。
为什么离线安装 mysql-server.deb 包容易失败
离线安装不是简单解压或 dpkg -i 一堆 .deb 就完事。MySQL 8.0 在 Ubuntu 22.04 中依赖至少 12 个间接包(如 libaio1、libmecab2、mysql-common、libmysqlclient21 等),这些包之间有严格版本约束和安装顺序。官方 .deb 包未按依赖拓扑排序,手动安装时常见问题包括:
-
dpkg: dependency problems报错后强行--force-depends,导致mysqld启动时 segfault 或找不到libtinfo.so.6 -
mysql-server包安装时不会自动运行mysqld --initialize,/var/lib/mysql目录为空,systemd 服务启动即失败 - 缺少
mysql-systemd-start脚本或mysql.service单元文件,systemctl start mysql报Failed to start mysql.service: Unit mysql.service not found - AppArmor 配置缺失,
mysqld因权限拒绝被 kernel 杀死,日志里只显示Operation not permitted
如果真要离线部署,必须按这四步走
跳过所有“一键 dpkg -i *.deb”的教程。正确路径是模拟 apt 的行为,分阶段还原:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 先用一台联网的 Ubuntu 22.04 执行:
apt download mysql-server,它会自动拉取mysql-server及其全部 runtime 依赖(含mysql-server-8.0、mysql-client-8.0、mysql-common等) - 把下载到的全部
.deb文件拷到目标机器,用dpkg -i --auto-select *.deb(不是逐个 dpkg -i),让 dpkg 自动解析依赖并排序安装 - 安装完成后,手动触发初始化:
sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql --log-error=/var/log/mysql/error.log,否则systemctl start mysql必然失败 - 检查
/lib/systemd/system/mysql.service是否存在;若缺失,从干净的 Ubuntu 22.04 系统中复制该文件,并运行sudo systemctl daemon-reload
auth_socket 认证问题在离线安装里更难修复
离线安装出来的 MySQL 8.0 默认仍是 auth_socket 插件认证 root@localhost,但你没法直接 sudo mysql 进去改——因为离线环境大概率没装 mysql-client 包,连 mysql 命令都不存在。此时只能:
- 先确认
mysql-client已随依赖一并安装(查dpkg -l | grep mysql-client) - 若没装,得单独补一个兼容的
mysql-clientdeb(注意版本必须匹配,比如mysql-client-8.0_8.0.45-1ubuntu22.04_amd64.deb) - 再执行:
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES;" - 别碰
plugin字段直写,UPDATE mysql.user SET plugin='mysql_native_password' ...会导致sudo mysql失效且无法恢复
真正需要离线部署的场景极少,多数是误判了“离线”定义——只要能配好内网 apt 代理或镜像源,就应优先走 apt。离线安装的代价不是多敲几行命令,而是每一步都失去 apt 的原子性保障和错误回滚能力。一旦 /var/lib/mysql 初始化失败或权限错乱,重装比修还快。

















