必须显式指定-DCMAKE_INSTALL_PREFIX和-DMYSQL_DATADIR,前者决定二进制及脚本安装路径(默认/usr/local易致混乱),后者硬编码默认数据目录且须与my.cnf中datadir严格一致并指向空目录。

必须显式指定 -DCMAKE_INSTALL_PREFIX,否则默认装到 /usr/local/,且后续路径引用会混乱。
cmake 必须在独立 build 目录中执行
源码根目录下没有 configure 脚本,直接运行 ./configure 会报错:no such file or directory: ./configure。MySQL 5.7+ 彻底弃用 Autotools,只支持 cmake。
- 先进入源码目录(如
/usr/local/src/mysql-8.0.42),再创建并进入build子目录:mkdir build && cd build -
cmake ..中的..指向上层源码目录;路径写错会导致CMake Error: The source directory does not appear to contain CMakeLists.txt - 不能在源码根目录直接运行
cmake .,否则可能触发-Dforce_insource_build=1强制开关——该选项未来会被 cmake 拒绝,且易引发构建污染
-DCMAKE_INSTALL_PREFIX 决定二进制和脚本存放位置
这个参数控制 mysqld、mysql、my_print_defaults 等可执行文件,以及 support-files/ 下启动脚本、配置模板的安装路径。它不控制数据目录,但影响 mysqld --help --verbose 输出里的默认 basedir 值。
- 典型写法:
-DCMAKE_INSTALL_PREFIX=/apps/mysql或-DCMAKE_INSTALL_PREFIX=/usr/local/mysql - 若不指定,cmake 默认使用
/usr/local,但bin/、lib/、share/全部落到该路径下,与常规部署习惯不符 - 该路径需确保当前用户有写权限;
make install后,/apps/mysql/bin/mysqld才真实存在,别指望在源码目录里直接运行bin/mysqld
DMYSQL_DATADIR 和配置文件中的 datadir 必须严格一致
-DMYSQL_DATADIR 是编译期硬编码的默认数据路径,初始化(mysqld --initialize)和启动时都会优先读取它。如果和 my.cnf 里写的 datadir 不一致,服务起不来,日志只报模糊错误:Can't find file: './mysql/plugin.frm'。
- 必须指向一个**空目录**,且
mysql用户对该目录有读写权限,例如:-DMYSQL_DATADIR=/data/mysql - 若同时用
-DSYSCONFDIR=/etc指定了配置文件位置,记得/etc/my.cnf中的[mysqld]段落也得写明:datadir = /data/mysql - 常见坑:有人设了
-DMYSQL_DATADIR=/data/mysql,但初始化时忘了加--datadir=/data/mysql参数,或启动时用了--defaults-file却没同步更新配置项,结果数据被写到默认位置(如/usr/local/mysql/data)
最易被忽略的是:cmake 阶段设定的路径,在二进制生成后就固化进可执行文件了,后续靠命令行或配置文件只能覆盖部分行为(比如 --basedir 可改 basedir,但无法绕过编译时定死的默认 datadir 查找逻辑)。所以 prefix 和 datadir 两个参数,一步错,步步错。


















