mysql 5.7 源码编译必须使用 cmake 且须在独立 build 目录中执行(如 mkdir build && cd build && cmake ..),禁止在源码根目录运行 cmake .;-dmysql_datadir 必须指向空目录并由 mysql 用户拥有权限;boost 1.59.0 为硬性依赖,推荐用 -ddownload_boost=1 -dwith_boost=/path 配合;启用系统 openssl 必须显式指定 -dwith_ssl=system。

MySQL 5.7 源码编译必须用 cmake,且不能在源码根目录直接运行;./configure 已彻底废弃,硬要执行会报 no such file or directory: ./configure。
cmake 必须在独立 build 目录中执行
旧教程常教你在解压后的 mysql-5.7.x 目录下直接运行 cmake .,这是错的。CMake 要求构建目录与源码目录分离,否则会污染源码、触发缓存冲突或找不到 CMakeLists.txt。
正确做法是:
- 进入源码目录后,先执行
mkdir build && cd build - 再运行
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql(注意是..,不是.) - 如果路径写成
cmake . -D...,会报错:The source directory does not appear to contain CMakeLists.txt - 每次重新配置前,建议删掉
build/CMakeCache.txt,避免旧参数残留干扰
DMYSQL_DATADIR 必须指向空目录且权限正确
这个参数不是可选项,不显式指定会导致初始化失败或启动报 Can't find file: './mysql/plugin.frm' —— 实际是 mysqld 找不到数据目录下的系统表文件。
关键约束:
-
-DMYSQL_DATADIR值必须是**完全为空的目录**,例如/data/mysql,不能是已存在旧数据的路径 - 该目录需由
mysql用户拥有读写权限:chown -R mysql:mysql /data/mysql - 若同时用
-DSYSCONFDIR=/etc,则后续/etc/my.cnf中的datadir必须和-DMYSQL_DATADIR值严格一致 - 别漏掉
-DMYSQL_USER=mysql,否则初始化脚本可能以 root 身份创建文件,导致启动时权限拒绝
Boost 1.59.0 是硬性依赖,但不用手动编译安装
MySQL 5.7 强制需要 Boost 1.59.0,但官方设计的是“源码级集成”,不是系统库链接。很多用户花几小时编译 Boost,结果 cmake 还是报 COULD_NOT_FIND_BOOST,根源在于路径理解错了。
真正有效的做法只有两种:
- 用
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/path/to/boost_dir,cmake 会自动下载并解压到该目录(推荐) - 手动把
boost_1_59_0.tar.gz放到/path/to/boost_dir下,cmake 会解压它(注意:不是放解压后的目录,是放压缩包) - 别用
./bootstrap.sh && make install安装 Boost 到系统,cmake 不认libboost_system.so这类动态库 - 路径中不能有多余斜杠,比如
/usr/local//boost会被识别失败
启用系统 OpenSSL 需显式指定 -DWITH_SSL=system
默认 cmake 会静态链接 MySQL 自带的 yaSSL,它不支持 TLSv1.2+、无法验证客户端证书,Java 或 Node.js 客户端容易握手失败。
要真正用上系统的 OpenSSL(如 RHEL 的 openssl-devel),必须加参数:
-
-DWITH_SSL=system—— 这是开关,缺一不可 - 同时确保系统已安装
openssl-devel(CentOS/RHEL)或libssl-dev(Debian/Ubuntu) - 别写成
-DWITH_SSL=yes或-DWITH_SSL=bundled,前者无效,后者等于没改 - 验证是否生效:编译完成后运行
/usr/local/mysql/bin/mysqld --verbose --help | grep ssl,输出中应含openssl字样,而非yassl
最容易被忽略的是 DMYSQL_DATADIR 和 DMYSQL_USER 的组合效应:目录权限对了,但初始化时没指定用户,文件仍会归 root 所有;或者目录空了,但忘了 chown,mysqld 启动直接静默退出。这类问题不会报明显错误,只在 error log 里留一句 “Starting MySQL” 就停住。











