编译mysql源码前须确认gcc≥9.2.1、cmake3、ncurses-devel、openssl-devel等依赖,并检查python3、/tmp空间;cmake配置需指定安装路径、字符集、引擎开关及系统目录;编译时应限并发、跳过非必要目标;安装后启动失败多因共享库缺失、消息文件路径错误或selinux限制。

编译前必须确认的依赖和系统状态
MySQL 源码编译不是“下载解压 make 就完事”,缺一个头文件或库,cmake 阶段就直接报错退出,而且错误信息往往不指明缺啥。最常踩的坑是以为装了 openssl-devel,结果系统里只有 openssl 运行时包,没装开发包;或者用较新版本(如 MySQL 8.0.33+)却用了旧版 cmake(要求 ≥ 3.20),报一堆 CMake Error at CMakeLists.txt 却找不到原因。
- 检查
gcc版本:MySQL 8.0 要求 ≥ 9.2.1(CentOS 7 自带 gcc 4.8 不行,得升级或用 devtoolset) - 必须安装:
cmake3(别用系统自带的cmake)、ncurses-devel、openssl-devel、zlib-devel、perl-Data-Dumper - 确认
/usr/bin/python3存在且可执行(MySQL 8.0+ 构建脚本依赖 Python 3,不是 Python 2) - 临时目录(如
/tmp)要有足够空间(编译过程峰值占用 > 2GB)
cmake 配置命令怎么写才不翻车
官方文档给的示例命令看着长,但多数参数不能照抄——比如 -DCMAKE_INSTALL_PREFIX 写错路径,后续启动服务时 mysqld 找不到配置或数据目录;又比如漏掉 -DDEFAULT_CHARSET=utf8mb4,装完才发现默认字符集还是 latin1,改起来比重装还麻烦。
- 基础必加项:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql(建议固定路径,别用~/mysql这类家目录) - 字符集相关:
-DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci(MySQL 8.0 默认 collation 是这个,别写成老的utf8mb4_unicode_ci) - 引擎和功能开关:
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1(不加这些,InnoDB 可能编译不进) - 避免权限问题:
-DINSTALL_SYSCONFDIR=/etc -DINSTALL_PID_FILE_DIR=/var/run/mysqld(否则启动时可能因找不到my.cnf或无权写 pid 报错)
执行前先清空构建目录:rm -rf build && mkdir build && cd build,不然旧缓存会导致 cmake 误判依赖状态。
make 编译慢、内存爆掉、中途失败怎么办
make -j$(nproc) 看似高效,但在 2GB 内存的虚拟机上大概率 OOM kill,mysqld 目标一链接就卡死。这不是代码问题,是链接器吃内存太狠。另外,MySQL 源码里部分测试组件(如 mysql-test-run.pl)会尝试联网拉镜像或下载测试数据,若网络不通,make 会卡在某个 target 上假死,看起来像崩溃。
- 限制并发:
make -j2(双核机器)或make -j1(≤ 2GB 内存)更稳 - 跳过非必要目标:
make -j2 mysqld只编译主服务,省掉客户端、测试套件等(后续按需再make install) - 遇到
Linking CXX executable ../runtime_output_directory/mysqld卡住超过 5 分钟,Ctrl+C后加ulimit -v 2000000(限制虚拟内存 2GB)再试 - 如果报
undefined reference to 'SSL_CTX_set_ciphersuites',说明 OpenSSL 版本太低(需 ≥ 1.1.1),降级 MySQL 版本或升级系统 OpenSSL
安装后启动失败的三个高频原因
编译成功、make install 完毕,一跑 mysqld --initialize 就崩,或者 systemctl start mysqld 显示 active (exited) 然后立刻退出。这类问题基本不出现在编译阶段,而是运行时环境没对齐。
-
mysqld: error while loading shared libraries: libtinfo.so.6: cannot open shared object file:CentOS 7 缺ncurses-compat-libs,装它就行(注意不是ncurses-devel) -
Can't find messagefile '/usr/local/mysql/share/english/errmsg.sys':cmake时漏了-DINSTALL_MYSQLSHAREDIR=share,或make install后没运行scripts/mysql_install_db(MySQL 5.7)或bin/mysqld --initialize(MySQL 8.0)初始化数据目录 - SELinux 启用状态下,
mysqld无法绑定 3306 或写/var/lib/mysql:临时关 SELinux 测试(setenforce 0),确认是它再配策略,别硬扛
初始化完成后,第一次登录用临时密码(在 error.log 末尾找 A temporary password is generated for root@localhost: 那行),别试空密码或 123456。











