mysql 8.4离线源码编译需确保glibc≥2.17、x86_64架构,并提前离线部署cmake 3.20+、gcc 9.4+及全部依赖;初始化必须指定--lower-case-table-names=1,启动前须手动创建并授权pid-file和socket目录。

mysqld 启动失败、cmake 报错、glibc 版本不兼容——这些不是配置问题,而是离线源码编译 MySQL 8.4 时几乎必踩的坑。直接用二进制包更稳;真要源码编译,必须提前在同构环境里交叉验证所有依赖。
确认系统架构和 glibc 版本是否匹配 MySQL 8.4 源码要求
MySQL 8.4 官方源码(如 mysql-8.4.0.tar.gz)要求最低 glibc 2.17(RHEL/CentOS 7+ 或 Ubuntu 16.04+),且仅支持 x86_64 架构。离线环境下无法动态升级 glibc,一旦版本低于要求,cmake 阶段会静默失败或 make 后运行时报 GLIBC_2.x not found。
- 先在目标服务器执行:
ldd --version和uname -m,确保输出为glibc 2.17+和x86_64 - 不要依赖“看起来像 CentOS 7”就跳过验证——某些定制版 OS 的
glibc实际是阉割版 - 若版本不足,放弃源码编译,改用对应
glibc版本的二进制包(如mysql-8.4.0-linux-glibc2.17-x86_64.tar.xz)
离线准备 CMake、GCC 和全部构建依赖
源码编译不是只传一个 .tar.gz 就行。cmake 3.20+、gcc 9.4+、openssl-devel、ncurses-devel、libaio-devel 等必须提前打包好并离线部署。缺任意一个,cmake . 会报类似 Could NOT find OpenSSL 或 Cannot find ncurses.h 的错误,且不会告诉你缺的是头文件还是库文件。
- 在一台同系统、同版本的联网机器上,用
yum install --downloadonly --downloaddir=./deps下载所有依赖 RPM 包(CentOS/RHEL)或用apt download(Ubuntu/Debian) -
cmake和gcc必须是静态编译或自带运行时的版本;别用系统默认的旧版cmake 2.8,它无法识别 MySQL 8.4 的CMakeLists.txt语法 - 把
cmake二进制、gcc工具链、所有.rpm或.deb包一并拷到目标机,用rpm -ivh *.rpm --nodeps或dpkg -i *.deb安装
初始化前必须设置 lower_case_table_names=1(且仅限首次)
MySQL 8.4 的数据字典强依赖 lower_case_table_names 设置,且该值**只能在初始化数据库前通过 mysqld 命令行参数指定,不能靠修改 my.cnf 补救**。离线环境没机会重试,一旦忽略,初始化后表名大小写行为将与应用预期不符,修复需重建整个实例。
- 初始化命令必须带参数:
./bin/mysqld --user=mysql --initialize --lower-case-table-names=1 --basedir=/usr/local/mysql --datadir=/data/mysql - 注意参数名是
--lower-case-table-names(带连字符),不是lower_case_table_names;拼错会导致参数被忽略 - 该参数值只能是
0或1;设为2在 8.4 中已被移除,会直接报错退出
启动失败时优先检查 socket 和 pid-file 路径权限
离线编译安装后 service mysql start 报 ERROR! The server quit without updating PID file,90% 是因为 pid-file 或 socket 所在目录不属于 mysql 用户,或父目录无执行(x)权限。这跟在线安装不同——离线编译不会自动创建 /var/run/mysqld 这类目录。
- 检查
my.cnf中pid-file=/data/mysql/mysql.pid和socket=/tmp/mysql.sock对应路径是否存在、属主是否为mysql -
/tmp默认可写,但某些加固系统会挂载noexec,此时需改用/var/run/mysqld/mysql.sock并手动创建目录:mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld - 务必确认
/data/mysql目录下有mysql.err日志文件,且mysql用户对其有写权限;日志里通常有真实报错,比如Can't create/write to file '/data/mysql/mysql.pid'
cmake 成功不代表 make 能过,make 成功也不代表 mysqld 能加载 libssl.so.1.1。最省事的做法:在同构虚拟机里完整跑通一遍,再把整个 build/ 目录和最终二进制打包带走。











