必须安装cmake(3.12+)、gcc、g++、ncurses-devel、openssl-devel、zlib-devel,缺一不可;debian/ubuntu对应包名后缀为-dev;cmake参数需设-dwith_ssl=system、-ddefault_charset=utf8mb4等,编译内存不足时应降-j数或加swap。

mysql源码编译前必须装齐的依赖包有哪些
缺依赖是编译失败最常见原因,不是版本不对,而是压根没装。Linux发行版默认不带MySQL构建所需全套工具链。
以下包缺一不可,按实际发行版安装:
-
cmake(3.12+,MySQL 8.0 要求;别用系统自带的 2.x) -
gcc、g++(C/C++ 编译器,CentOS/RHEL 用gcc-c++) -
ncurses-devel(终端控制库,漏掉会报Could not find ncurses library) -
openssl-devel(SSL 支持,不装则--with-ssl失败或降级为 disabled) -
zlib-devel(压缩支持,影响myisampack等工具) - (可选但建议)
libaio-devel(异步 I/O,InnoDB 性能相关)
Debian/Ubuntu 对应包名后缀是 -dev(如 libncurses5-dev),别直接照抄 CentOS 名字。
cmake 配置参数怎么选才不踩坑
MySQL 源码不再支持 ./configure,全靠 cmake 控制行为。参数写错,轻则功能缺失,重则编译报错或运行时崩溃。
关键参数组合建议(以 MySQL 8.0 为例):
- 基础路径:用
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql,别写成/usr/mysql—— 后续mysqld找配置文件会绕弯 - 数据目录分离:加
-DMYSQL_DATADIR=/data/mysql,避免装完就往install_prefix下塞数据 - SSL 强制启用:
-DWITH_SSL=system(复用系统 OpenSSL),别用builtin,否则容易和系统 libssl 版本冲突 - 字符集默认设对:
-DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci,漏设会导致客户端连上后仍用 latin1 - 禁用不需要的组件节省时间:
-DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=ON,其他引擎如EXAMPLE、FEDERATED建议关掉
执行前先清空构建目录(rm -rf CMakeCache.txt CMakeFiles/),缓存残留常导致参数不生效。
make 编译慢、内存爆掉或中途失败怎么办
make 阶段卡住或 virtual memory exhausted 是物理内存不足的明确信号,不是代码问题。
解决方法很直接:
- 限制并发数:
make -j$(nproc)改成make -j2(双核机器)或make -j1(1GB 内存 VPS) - 临时扩 swap:
dd if=/dev/zero of=/swapfile bs=1G count=2 && mkswap /swapfile && swapon /swapfile,编译完可swapoff /swapfile && rm /swapfile - 跳过文档和测试编译(省 30% 时间):
-DINSTALL_DOCINFO=OFF -DINSTALL_MAN_PAGES=OFF -DWITH_UNIT_TESTS=OFF - 如果报
error: ‘std::max’ is not a template function,说明 GCC 版本太低(
编译完成不要急着 make install,先确认 bin/mysqld --version 能输出正确版本号。
初始化数据库后无法启动 mysqld 的典型原因
跑完 mysqld --initialize,systemctl start mysqld 报 Failed to start mysqld.service,八成不是配置文件写错,而是权限或 SELinux 拦截。
检查顺序要严格:
- 确认
/data/mysql(或你设的datadir)属主是mysql:mysql,且权限为750,不能是root或777 - 确认
my.cnf中user=mysql已设置,且该用户存在(id mysql可查) - SELinux 开启时,
setsebool -P mysqld_disable_trans on或semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?" && restorecon -Rv /data/mysql - 日志里出现
Can't open the mysql.plugin table?说明--initialize没成功,删掉datadir重来,别跳过这步 - 首次启动必须用
--initialize(生成 root 密码),不是--initialize-insecure,后者在 8.0+ 已废弃且不兼容新认证插件
初始化生成的临时密码在错误日志末尾(grep 'temporary password' /var/log/mysqld.log),不是 stdout 输出——这点最容易漏看。











