不能直接用系统自带的gcc 4.8.5和cmake 2.8编译mysql 8.0,必须升级至gcc≥5.3(推荐devtoolset-11)、cmake≥3.15(建议3.25.3或3.28.4),且必须使用含boost的源码包(mysql-boost-8.x.x.tar.gz),-dwith_boost需指向解压后源码内的boost/目录,并在独立构建目录中执行cmake ..。

不能直接用系统自带的 gcc 4.8.5 和 cmake 2.8 编译 MySQL 8.0——编译会失败,报错如 "CMake 3.5.1 or higher is required" 或 "does not appear to contain CMakeLists.txt"。必须升级工具链并严格匹配源码包类型。
必须用带 boost 的源码包,且路径不能出错
MySQL 8.0 官方提供两类源码包:mysql-8.x.x.tar.gz(不带 boost)和 mysql-boost-8.x.x.tar.gz(含内嵌 boost)。后者才是编译必需的,前者缺少 boost 子目录,cmake 配置时会因 -DWITH_BOOST 指向无效路径而中断。
-
cmake配置中-DWITH_BOOST必须指向解压后源码树内的boost/目录,例如:-DWITH_BOOST=/usr/local/src/mysql-8.0.36/boost - 若手动下载了不带 boost 的包,又没单独编译安装 boost 库,
cmake会报"Could not find Boost"并退出 - 解压后务必进入源码根目录(含
CMakeLists.txt),再新建独立构建目录(如bld/),避免in-source build冲突
GCC 和 CMake 版本有硬性门槛
CentOS 7 自带的 gcc 4.8.5 不支持 MySQL 8.0 所需的 C++17 特性;cmake 2.8.12 也不满足最低 3.5.1 要求。必须显式启用新版工具链,否则 make 过程会在中段报 "error: 'optional' is not a member of 'std'" 等编译错误。
- 推荐用 SCL(Software Collections)安装
devtoolset-11:运行scl enable devtoolset-11 bash启动新 shell,再验证gcc --version输出为11.4.1左右 - CMake 必须 ≥ 3.15(官方文档明确要求),建议装
cmake-3.28.4或3.25.3;装完后用ln -s /usr/local/bin/cmake /usr/bin/cmake覆盖系统默认路径 - 不要在
root环境下长期启用devtoolset,否则可能影响其他软件编译行为;应只在 MySQL 构建会话中启用
cmake 配置参数里几个关键坑点
参数顺序和值写错会导致初始化失败、socket 找不到、甚至服务启动后立即退出。尤其注意路径权限、字符集和 inno 引擎开关。
-
-DMYSQL_DATADIR和-DMYSQL_UNIX_ADDR必须是绝对路径,且对应目录需提前创建并由mysql用户可写(如/data/mysql) -
-DDEFAULT_CHARSET=utf8mb4和-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci是 MySQL 8.0 推荐组合;用utf8(实际是 utf8mb3)会触发警告,且部分新特性不可用 - 必须开启
-DWITH_INNOBASE_STORAGE_ENGINE=1,否则mysqld启动时报"Unknown/unsupported storage engine: InnoDB" - 加
-DFORCE_INSOURCE_BUILD=1仅用于调试;生产环境务必在独立bld/目录中执行cmake ..,否则make clean会误删源码
初始化前必须装 libaio,且用户权限要彻底隔离
即使 make install 成功,mysqld --initialize 仍可能卡住或报 "Failed to open log file"——常见原因是缺少异步 I/O 支持库,或数据目录归属混乱。
- 运行
yum install -y libaio,这是 MySQL 8.0 启动强依赖,CentOS 7 默认不装 -
useradd -r -s /sbin/nologin -M mysql创建无家目录、无登录权限的系统用户;chown -R mysql:mysql /data/mysql必须递归到最底层子目录 - 初始化命令必须显式指定用户:
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql;漏掉--user会导致文件属主为root,后续服务无法读取 - 初始化成功后,检查
/data/mysql下是否生成了ibdata1、mysql/、sys/等目录,以及错误日志中是否有"A temporary password is generated"
最容易被忽略的是:初始化之后,mysql 用户对 /usr/local/mysql 二进制目录没有执行权限,启动脚本会因找不到 mysqld 而失败;必须补一句 chown -R root:mysql /usr/local/mysql,再把数据目录权限单独收窄回 mysql:mysql。











