ubuntu 22.04 上不推荐编译安装 mysql 8.0,因其依赖复杂、易因 openssl/cmake/ssl 库版本错位失败,且需手动配置 systemd、用户权限、字符集等,运维成本远高于 apt 安装。

Ubuntu 22.04 上不推荐编译安装 MySQL 8.0 —— 官方源的 mysql-server 包已是 8.0.x(如 8.0.45),二进制稳定、依赖完整、服务集成好,编译不仅耗时长,还极易因 CMake 参数、SSL 库版本、字符集配置等出错,且后续升级、维护成本远高于 apt 安装。
为什么编译安装在 Ubuntu 22.04 上大概率失败
MySQL 8.0 编译依赖项多、检查严,Ubuntu 22.04 默认环境与官方构建条件存在几处关键错位:
-
caching_sha2_password插件依赖 OpenSSL 3.0+,但 Ubuntu 22.04 默认 OpenSSL 是 3.0.2,部分旧版 MySQL 8.0 源码(如 8.0.33 及更早)会因宏定义冲突报OPENSSL_NO_SSL3错误 - 默认未安装
libedit-dev、libprotobuf-dev、protobuf-compiler,缺一即卡在cmake阶段,错误信息常为 “Could NOT find XXX (missing: XXX_LIBRARIES)” - MySQL 8.0 要求 C++17 编译器,Ubuntu 22.04 自带
g++版本虽达标(11.4+),但若系统曾手动升级过 GCC,CMake 可能误判标准库路径,导致链接时找不到std::filesystem - 编译生成的
mysqld默认不带 systemd 单元文件,需手动写/etc/systemd/system/mysqld.service,稍有不慎就无法systemctl start mysqld
如果你坚持要编译,必须做这三件事
跳过“下载源码→cmake→make→make install”这种泛泛流程,只说真正卡住人的硬性动作:
- 用官方发布的
mysql-8.0.45.tar.gz(非 GitHub 镜像或分支),地址:https://dev.mysql.com/downloads/mysql/→ Archives → 选Source Code→Generic Linux (Architecture Independent) - 安装完整构建依赖(缺一不可):
sudo apt install cmake g++ libncurses5-dev libssl-dev liblz4-dev libzstd-dev libprotobuf-dev protobuf-compiler libedit-dev libwrap0-dev libxml2-dev zlib1g-dev - CMake 命令必须显式指定关键路径和选项,例如:
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql8 \ -DMYSQL_DATADIR=/var/lib/mysql8 \ -DSYSCONFDIR=/etc/mysql \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \ -DWITH_SSL=system \ -DWITH_PROTOBUF=system \ -DWITH_SYSTEMD=ON \ -DFORCE_INSOURCE_BUILD=OFF
注意:-DWITH_SYSTEMD=ON是启用 systemd 支持的关键,否则编译完没有support-files/mysql.server或 service 文件
编译后仍需手动补全的系统级配置
即使 make && make install 成功,MySQL 还不能直接当生产服务用:
- 必须创建系统用户:
sudo groupadd mysql && sudo useradd -r -g mysql -s /bin/false mysql,否则mysqld --initialize会因权限拒绝初始化数据目录 - 初始化命令必须加
--user=mysql,且首次运行前要确保/var/lib/mysql8为空并属主正确:sudo chown -R mysql:mysql /var/lib/mysql8 - 初始化后生成的临时密码在
stderr输出里,不是日志文件;且默认认证插件是caching_sha2_password,老 JDBC 驱动连不上,得进 mysql 后执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpass'; - 防火墙没开 3306,远程连不上;SELinux 在 Ubuntu 上默认不启用,但 AppArmor 规则可能拦截,检查:
sudo aa-status | grep mysql,若存在限制需调整/etc/apparmor.d/usr.sbin.mysqld
真正需要定制编译的场景极少:比如你必须打 patch 修复某个内部 bug,或强制禁用某模块(如 component_log_sink_syseventlog)。其他所有情况,包括想控制安装路径、改默认字符集、开 audit log,都能通过修改 /etc/mysql/mysql.conf.d/mysqld.cnf 和 mysql_secure_installation 完成 —— 不必碰编译。











