源码编译安装MySQL 8.0适用于需定制构建、审计依赖或离线部署的场景,非新手推荐方式;必须满足cmake≥3.16、gcc≥5.3、使用带Boost的源码包并指定绝对路径,初始化前须配好my.cnf及datadir权限,临时密码仅在首次日志中输出一次。

源码编译安装 MySQL 8.0 不是“推荐给新手的安装方式”,而是明确用于需要定制构建、审计依赖、或在无网络/受限环境部署的场景。它必然耗时、占内存、易出错,但换来的是对二进制行为的完全掌控——比如你必须自己决定是否启用 libedit、是否静态链接 Boost、是否关闭 SSL 等。
为什么 cmake 版本和 gcc 版本不能凑合
MySQL 8.0 的 CMakeLists.txt 显式要求 CMAKE_VERSION ≥ 3.5(实际建议 ≥ 3.16),低于该版本会直接报错:CMake Error at CMakeLists.txt:29 (cmake_minimum_required): CMake 3.5 or higher is required. 同样,gcc 5.3 是硬性门槛:旧版 gcc 编译到 sql/sql_parse.cc 时大概率触发 error: ‘std::optional’ has not been declared——因为 C++17 的 std::optional 在 gcc 5.3 才开始实验性支持。
- 验证命令必须分开执行:
cmake --version和gcc --version,不能只信包管理器显示的“已安装” - CentOS 7 默认的
cmake 2.8.12和gcc 4.8.5必须替换,推荐用 SCL 或手动解压二进制版cmake-3.24.2 - Rocky Linux 9 / CentOS Stream 9 自带
gcc 11+和cmake 3.22+,可跳过升级步骤,但需确认cmake在$PATH前置
必须用带 boost 的源码包,且路径不能错
MySQL 8.0 源码中大量使用 Boost 头文件(如 boost/algorithm/string.hpp),但官方不提供自动下载逻辑。如果你下载的是不带 boost 的源码包(如 mysql-8.0.40.tar.gz 而非 mysql-boost-8.0.40.tar.gz),cmake .. 阶段就会卡在 -- Could NOT find Boost 并终止。
- 下载页面务必选 “Source Code with Boost” 分类,文件名含
boost字样 -
-DWITH_BOOST参数必须指向解压后boost子目录的**绝对路径**,例如:-DWITH_BOOST=/usr/local/src/mysql-8.0.40/boost/boost_1_78_0/ - 路径末尾的斜杠
/不能省,否则 cmake 会认为这是文件而非目录 - 不要试图用系统包管理器装
boost-devel替代——版本不匹配(MySQL 8.0.40 锁死boost 1.78.0)会导致编译失败
初始化失败常见于 my.cnf 和 datadir 权限组合错误
执行 bin/mysqld --defaults-file=/etc/my.cnf --user=mysql --initialize 报错,最常不是配置写错,而是权限链断裂。典型错误信息:[ERROR] [MY-010461] [Server] Failed to open log file '/data/mysql/mysqld.log'. 或更隐蔽的 [ERROR] [MY-012577] [InnoDB] Cannot create redo log files because data directory does not exist.
-
datadir目录(如/data/mysql/data)必须由mysql用户**完全拥有**,且不能是 root 创建后仅chown——SELinux 或 systemd-private-tmp 可能残留上下文,建议用mkdir -p /data/mysql/data && chown -R mysql:mysql /data/mysql从头建 -
my.cnf中的log-error、pid-file、socket所在目录,只要涉及写入,都必须确保mysql用户有写权限;/tmp/mysql.sock在某些发行版下被 tmpfiles.d 限制,建议改用/var/lib/mysql/mysqld.sock - 初始化命令里**不能加
--basedir**:mysqld 会从--defaults-file解析basedir,重复传参反而触发unknown variable 'basedir'
启动失败时优先检查 socket 和 libtinfo.so.5
执行 support-files/mysql.server start 显示成功,但 mysql -u root -p 连不上,90% 是 socket 路径不一致或动态库缺失。错误现象分两类:
-
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'→ 检查my.cnf中socket值与客户端默认路径是否一致;临时解决:加-S /var/lib/mysql/mysqld.sock -
mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file→ 这是 MySQL 8.0 二进制依赖的 ncurses 兼容层问题,在 Rocky 9 / CentOS Stream 9 上默认只有libtinfo.so.6;运行ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5即可,无需重装 - systemd 启动失败?别急着改
mysql.service,先手动跑一次bin/mysqld --defaults-file=/etc/my.cnf --user=mysql看实时日志输出,比 journalctl 更直接
整个过程里最容易被忽略的,是初始化后那行藏在 log-error 文件里的临时密码——它只出现一次,且格式为 A temporary password is generated for root@localhost: xxxxxx。一旦错过,重置成本远高于重新初始化。另外,lower_case_table_names=1 必须在初始化前就写进 my.cnf,初始化后再改会导致数据字典不一致,直接无法启动。


















