MySQL源码编译需装齐四类依赖:C++编译器、CMake工具链、SSL支持库、压缩/字符集基础库;Ubuntu/Debian与CentOS/RHEL包名不同,装错将卡在cmake阶段报NOTFOUND。

MySQL源码编译前必须装齐的依赖包
缺依赖是编译失败最常见原因,不是“少一个”,而是常缺四类:C++编译器、CMake工具链、SSL支持库、压缩/字符集基础库。Ubuntu/Debian和CentOS/RHEL的包名不一致,装错就卡在cmake阶段报一堆NOTFOUND。
- Ubuntu 22.04+:
sudo apt install build-essential cmake libssl-dev libncurses5-dev liblz4-dev libzstd-dev zlib1g-dev - CentOS 8+:
sudo dnf install gcc-c++ cmake openssl-devel ncurses-devel lz4-devel zstd-devel zlib-devel - 特别注意
libncurses5-dev(Ubuntu)不能用libncurses6-dev替代,MySQL 8.0.x仍硬依赖v5 ABI;CentOS上ncurses-devel通常OK,但若报term.h not found,要确认是否装了完整版(非最小安装) - 别跳过
zstd-devel和lz4-devel——MySQL默认启用这些压缩算法,关掉它们要加-DENABLED_LOCAL_INFILE=OFF -DWITH_ZSTD=OFF -DWITH_LZ4=OFF,但生产环境不建议
cmake命令里最关键的几个开关参数
MySQL源码不提供configure脚本,全靠cmake控制构建行为。参数写错,轻则编译出错,重则装完连mysqld都起不来——比如默认用mysql用户运行,但系统没这个用户就会静默失败。
- 基础路径与用户:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_USER=mysql ..(..别漏) - 必须指定存储引擎:
-DDEFAULT_STORAGE_ENGINE=InnoDB,否则默认是MyISAM,且后续无法通过配置文件切换 - 字符集要显式设:
-DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci,不设就用latin1,连建库都可能乱码 - 禁用测试套件省时间:
-DENABLE_DOWNLOADS=OFF -DINSTALL_TESTDATA=OFF,否则cmake会尝试下载Boost,网络差时卡死
make编译时内存和线程踩坑点
make -j$(nproc)看着快,但在8GB内存以下机器上大概率OOM,cc1plus进程被kill,日志只显示internal compiler error,根本看不出是内存不够。
- 内存低于12GB,强制用
make -j2;16GB以上才考虑-j4 - 遇到
virtual memory exhausted: Cannot allocate memory,不是磁盘满,是RAM+swap撑不住——临时加swap:sudo fallocate -l 2G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile -
make中途中断后,别直接make重来,先make clean或删掉整个build/目录,残留的.o文件可能引发符号冲突
install后初始化失败的三个高频原因
make install成功不代表能用。执行bin/mysqld --initialize --user=mysql失败,八成是权限、路径或配置问题。
- 数据目录(如
/usr/local/mysql/data)必须为空且属主为mysql:sudo chown -R mysql:mysql /usr/local/mysql/data - 如果提示
Failed to find valid data directory,检查my.cnf里datadir路径是否和--initialize用的路径一致,且该路径不能是软链接(MySQL 8.0.33+对symlink更敏感) -
--initialize生成的临时密码在错误日志里,不是终端输出——查/usr/local/mysql/data/hostname.err,里面找A temporary password那一行
初始化这步最容易在datadir权限和my.cnf路径不一致上栽跟头,多花两分钟核对路径比重编译三小时强。

















