不建议在 Ubuntu 22.04 上编译安装 MySQL 8.0,除非有打补丁、调试源码等明确需求;官方 APT 源(如 mysql-server)已预装优化的 MySQL 8.0.45,自带 systemd 集成、安全默认配置和自动依赖管理,而编译易遇 libtinfo 版本冲突、CMake 选项遗漏、systemd 单元缺失、AppArmor 阻止启动等问题。

直接回答:不建议在 Ubuntu 22.04 上编译安装 MySQL 8.0
除非你有明确需求(比如要打特定补丁、调试源码、或构建非标准架构的二进制),否则用 apt install mysql-server 是最稳、最省事的选择。Ubuntu 22.04 官方源里的 mysql-server 就是 MySQL 8.0.x(如 8.0.45),已预编译优化,带 systemd 集成、安全默认配置和自动依赖管理。自己编译不仅耗时长、容易出错,还绕过了包管理器的更新和修复机制。
为什么编译安装在 Ubuntu 22.04 上特别容易翻车
MySQL 8.0 的 CMake 构建链对环境敏感,而 Ubuntu 22.04 默认工具链(GCC 11+、CMake 3.22+)与 MySQL 官方源码的兼容性存在几处硬坑:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
libtinfo版本冲突:MySQL 8.0 的部分二进制依赖libtinfo.so.5,但 Ubuntu 22.04 只提供libtinfo.so.6;手动软链接(ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.5)能临时解决,但属于 hack,后续升级可能失效 - CMake 选项易漏:必须显式指定
-DWITH_SSL=system,否则会尝试下载并编译 OpenSSL 源码,失败率极高;漏掉-DDEFAULT_CHARSET=utf8mb4或-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci会导致初始化后字符集不一致 - systemd 单元文件需手写:apt 安装自动生成
/lib/systemd/system/mysql.service,编译安装得自己写,且路径、用户、权限稍有偏差就会启动失败 - 初始化脚本缺失:
mysqld --initialize生成的 root 临时密码藏在日志里,但没mysql_secure_installation的交互引导,新手极易卡在“不知道初始密码是多少”
如果真要编译,关键步骤不能跳
仅当确认必须编译时,按以下最小可行路径操作(基于 MySQL 8.0.45 源码):
- 先装齐构建依赖:
sudo apt install cmake g++ libncurses5-dev libssl-dev liblz4-dev libzstd-dev zlib1g-dev - 下载源码包(不是二进制 tarball):
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.45.tar.gz - 解压后进目录,用这组 CMake 命令(严格复制):
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql8 \ -DWITH_SSL=system \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \ -DWITH_SYSTEMD=ON \ -DFORCE_INSOURCE_BUILD=OFF
-
make -j$(nproc)编译完,再sudo make install - 创建系统用户:
sudo groupadd mysql && sudo useradd -r -g mysql -s /bin/false mysql - 初始化数据目录:
sudo /usr/local/mysql8/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql8/data,注意看终端输出末尾的临时密码 - 手动启用 systemd:
sudo systemctl daemon-reload && sudo systemctl enable /usr/local/mysql8/usr/lib/systemd/system/mysqld.service(路径需根据实际生成位置调整)
最常被忽略的收尾动作
编译安装后,mysql 命令默认不在 $PATH 里,必须手动加:echo 'export PATH=/usr/local/mysql8/bin:$PATH' | sudo tee -a /etc/profile.d/mysql.sh && source /etc/profile.d/mysql.sh。另外,Ubuntu 22.04 的 AppArmor 配置默认只认 /var/lib/mysql,若你把数据目录放在别处(比如 /usr/local/mysql8/data),AppArmor 会静默阻止 mysqld 启动——得手动改 /etc/apparmor.d/usr.sbin.mysqld 并执行 sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld。这个点几乎没人提,但却是编译安装后服务起不来最常见的原因。

















