编译成功关键在依赖、权限、目录归属三者正确:必须安装ncurses-devel和openssl-devel,mysql用户需拥有数据目录完整权限,cmake参数如-DDEFAULT_CHARSET=utf8mb4、-DMYSQL_DATADIR等须严格准确无误。

能编译成功,关键不在命令多长,而在依赖、用户权限、目录归属这三件事是否提前做对。其他都是细节。
cmake 配置阶段报错:找不到 ncurses 或 openssl
这是最常卡住的地方。MySQL 编译时会硬依赖 ncurses-devel 和 openssl-devel,但系统默认不装。CentOS/Rocky/AlmaLinux 上必须手动补全:
yum install -y ncurses-devel openssl-devel libtirpc-devel rpcgen- RHEL/CentOS 7 还要先启用 SCL 源:
yum install -y centos-release-scl,再装devtoolset-11-gcc等工具链 - Ubuntu/Debian 换成:
apt-get install -y libncurses5-dev libssl-dev build-essential - 别只装
openssl,必须是openssl-devel(开发头文件);ncurses同理,缺-devel就会报Could NOT find Curses
mysql 用户和数据目录权限没设对
哪怕 cmake 成功、make 也过了,初始化时仍会失败,典型错误是 Can't create test file 或 Permission denied。根本原因是 MySQL 进程以 mysql 用户运行,但目录归属没改:
- 创建用户必须用
useradd -r -s /sbin/nologin -d /data/mysql mysql(-r创建系统用户,-d指定家目录) - 数据目录如
/data/mysql必须chown -R mysql:mysql /data/mysql,不能只 chown 一次父目录 - 如果用
--datadir=/data/mysql/data,那/data/mysql/data本身也要归 mysql 所有,且上级目录/data/mysql至少要有执行权限(chmod 755 /data/mysql)
cmake 参数里容易写错的几个关键项
参数名大小写敏感、拼写容错极低,写错一个字母就导致引擎没启用或字符集失效:
-
-DDEFAULT_CHARSET=utf8mb4不是utf8(后者是 MySQL 旧版伪编码,实际只支持 3 字节) -
-DDEFAULT_COLLATION=utf8mb4_unicode_ci,不是utf8_general_ci(已弃用) -
-DMYSQL_DATADIR和-DCMAKE_INSTALL_PREFIX路径结尾不要加斜杠,否则后续mysqld --initialize可能找不到bin/mysqld - MySQL 5.7+ 必须显式指定 Boost 路径:
-DWITH_BOOST=/path/to/boost_1_59_0,否则 cmake 会报Could not find suitable Boost version - MySQL 8.0 默认禁用本地文件导入,如需
LOAD DATA INFILE,得加-DENABLED_LOCAL_INFILE=ON
初始化后启动失败:socket 或 pid 文件路径不一致
常见现象是 systemctl start mysqld 报 Failed to start mysqld.service: Unit not found,或手动跑 mysqld 提示 Can't start server: Bind on unix socket: Permission denied:
- 确认
my.cnf里socket和pid-file路径与 cmake 的-DMYSQL_UNIX_ADDR、-DMYSQL_PID_FILE严格一致 - 例如 cmake 用了
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock,那配置文件里就得写socket = /tmp/mysql.sock,不能写成/var/lib/mysql/mysql.sock -
mysql-files目录(用于SELECT ... INTO OUTFILE)必须存在且属主为 mysql:mkdir -p /usr/local/mysql/mysql-files && chown mysql:mysql /usr/local/mysql/mysql-files
真正麻烦的从来不是编译命令本身,而是每个环节都要求“路径、权限、参数”三者严丝合缝。漏掉任意一个,就会在初始化或启动时才暴露,而不是在 make 阶段报错。


















