必须用cmake配置(mysql 5.7起弃用configure),且需显式指定-dcmake_install_prefix、-dmysql_datadir等关键参数;make && make install后不能直接启动,须先初始化数据目录并检查权限、socket路径及配置文件加载顺序。

cmake 是必须的,不是可选;make && make install 之后不能直接启动,必须先初始化数据目录。源码编译 MySQL 不是“解压即用”,漏掉任意一个环节都会导致后续报错,比如 mysqld: error while loading shared libraries 或 Can't find messagefile。
确认系统依赖是否齐全
缺依赖是编译失败最常见原因,且错误提示往往不直观。比如 cmake 报 “Could NOT find Curses” 实际是缺 ncurses-devel,报 “Could NOT find OpenSSL” 是缺 openssl-devel。
- RHEL/CentOS/Rocky 8+:
yum install -y cmake gcc gcc-c++ openssl-devel ncurses-devel libtirpc-devel rpcgen - CentOS 7:先启用 SCL 源,再装
devtoolset-11-gcc devtoolset-11-gcc-c++ openssl-devel ncurses-devel - Ubuntu/Debian:
apt install -y cmake build-essential libssl-dev libncurses5-dev libtirpc-dev - Boost 是硬依赖(MySQL 5.7+ 默认需要),若源码包里没带
boost子目录,得单独下载并用-DWITH_BOOST=/path/to/boost指定
cmake 配置参数怎么写才不出错
参数顺序不重要,但关键路径和引擎开关必须显式声明。MySQL 5.7 和 8.0 的默认行为差异大,比如 8.0 默认启用 caching_sha2_password 认证插件,而旧客户端可能不兼容。
- 基础必填项:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql(安装路径)、-DMYSQL_DATADIR=/data/mysql(数据目录)、-DDEFAULT_CHARSET=utf8mb4、-DDEFAULT_COLLATION=utf8mb4_unicode_ci - 存储引擎建议显式打开:
-DWITH_INNOBASE_STORAGE_ENGINE=1(InnoDB)、-DWITH_MYISAM_STORAGE_ENGINE=1(MyISAM) - 避免 systemd 冲突(尤其在非 systemd 系统或手动管理时):
-DCONNECT_WITH_SYSTEMD=OFF - MySQL 8.0+ 必须指定 Boost 路径,否则
cmake会卡在下载环节(即使网络通):-DWITH_BOOST=/usr/local/src/boost_1_70_0
初始化数据库前要检查三件事
运行 mysqld --initialize 前,如果忽略以下检查,大概率会初始化失败或生成不可用实例:
-
/data/mysql目录存在且属主为mysql用户:chown -R mysql:mysql /data/mysql -
/usr/local/mysql下有mysql-files目录且权限为 750:mkdir -p /usr/local/mysql/mysql-files && chown mysql:mysql /usr/local/mysql/mysql-files && chmod 750 /usr/local/mysql/mysql-files - 确保
my.cnf中没残留skip-grant-tables或错误的socket路径,否则初始化时会拒绝写入 - 执行初始化命令:
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql,注意看终端输出末尾的临时 root 密码
启动失败常见原因和快速验证点
启动 mysqld 后立刻退出?别急着查日志,先看这四点:
- 检查
/data/mysql下是否有ibdata1、mysql子目录 —— 没有说明初始化根本没成功 - 确认
/tmp/mysql.sock或你配置的socket路径父目录可写,否则报Can't start server : Bind on unix socket - 用
/usr/local/mysql/bin/mysqld --verbose --help | grep "Default options"看它实际加载了哪个my.cnf,常因路径不对导致配置失效 - 临时用
--console启动:/usr/local/mysql/bin/mysqld --user=mysql --console,错误直接打到终端,比翻error.log快得多
.service),systemctl start mysqld 必然失败,除非你手写或用官方 RPM 包里的模板。手动启停应始终走 mysqld_safe 或直接调用 mysqld 二进制,并确保环境变量 PATH 和 LD_LIBRARY_PATH 已包含安装路径。











