源码编译安装 mysql 5.7 在 centos 7 的核心难点是依赖处理、boost 路径指定、配置文件冲突和初始化权限四关;必须显式指定 -dwith_boost 指向 boost_1_59_0 目录,用 mysql 用户执行初始化并确保目录属主为 mysql:mysql,清除 mariadb 及旧配置,路径需全程一致。

源码编译安装 MySQL 5.7 在 CentOS 7 上不是“点几下就能好”的事,它适合需要自定义参数、验证特定行为或学习底层机制的场景;如果你只是想快速跑个数据库做开发测试,yum install mysql-community-server 更省心。但真要走源码路线,核心难点不在编译本身,而在于依赖处理、Boost 路径指定、配置文件冲突和初始化权限这四关——踩错一个,mysqld --initialize 就会直接报错退出。
cmake 配置必须显式指定 -DWITH_BOOST,否则编译失败
MySQL 5.7 源码(尤其带 boost 后缀的包)在 cmake 阶段会主动查找 Boost 库。CentOS 7 系统自带的 boost 版本(1.53)太老,不满足 MySQL 5.7 最低要求(1.59),所以不能依赖系统包。
- 推荐做法:下载
boost_1_59_0.tar.gz,解压后用-DWITH_BOOST=/path/to/boost_1_59_0显式指向目录(注意路径末尾不加斜杠) - 避免用
-DDOWNLOAD_BOOST=1:国内网络环境下大概率卡在 SSL 连接或超时,且 cmake 会把 boost 下载到临时目录,路径不可控 - 如果用的是不带 boost 的源码包(如
mysql-5.7.44.tar.gz),必须手动把boost_1_59_0放进源码根目录,并确保名字是boost(不是boost_1_59_0),否则 cmake 找不到 - 常见错误信息:
CMake Error at cmake/boost.cmake:194 (MESSAGE): You can try downloading ... manually或Could NOT find Boost
mysqld --initialize 失败八成是权限或目录问题
这个命令不是“执行完就完事”,它对用户、目录所有权、SELinux 状态极其敏感。哪怕只漏掉一步,就会卡在 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist 或直接静默退出。
- 必须用
mysql用户运行:sudo -u mysql /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql -
/data/mysql目录必须存在,且属主属组为mysql:mysql;/usr/local/mysql同样要chown -R mysql:mysql - CentOS 7 默认开启 SELinux,若未关闭,需临时设为 permissive 模式:
sudo setenforce 0(生产环境应配策略,非关闭) - 别忽略
mysql-files目录:5.7 要求该目录存在且属主为mysql,用于LOAD DATA INFILE,否则初始化可能警告甚至失败
启动前必须清理系统残留配置,否则 mysqld 拒绝启动
CentOS 7 自带 mariadb-libs,且可能残留 /etc/my.cnf 或 /etc/my.cnf.d/ 下的配置。这些会和你源码安装的 MySQL 冲突,导致服务无法识别参数或直接 core dump。
- 先卸载 MariaDB:
sudo yum remove mariadb-libs -y(注意加--nodeps可能引发其他依赖问题,慎用) - 删干净旧配置:
sudo rm -f /etc/my.cnf /etc/my.cnf.d/*,不要试图“注释掉”旧配置,mysqld会全部加载 - 你的新配置文件(如
/etc/my.cnf)里,[mysqld]段必须包含basedir和datadir,且路径与初始化时一致;socket路径建议用/tmp/mysql.sock,避免权限问题 - 别用
support-files/mysql.server脚本直接启动:它默认读/etc/init.d/mysqld,而该脚本可能仍指向系统自带路径;建议写 systemd unit 文件,或直接sudo -u mysql /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
初始化密码藏在日志里,但首次登录后必须立刻改密码
mysqld --initialize 成功后,root 密码不会打印在终端,而是写进错误日志(默认在 datadir 下的 hostname.err)。但这个密码仅限首次登录,且 MySQL 5.7 默认启用密码强度策略,简单密码会被拒绝。
- 查密码命令:
sudo grep 'temporary password' /data/mysql/*.err,输出类似:A temporary password is generated for root@localhost: a8ufy=hxcfqD - 登录后第一件事:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!';,否则后续任何操作都会被拦截 - 如果初始化时用了
--initialize-insecure,密码为空,但必须立即执行mysql_secure_installation,否则数据库裸奔 - 远程访问不是开个端口就行:需先
CREATE USER 'root'@'%' IDENTIFIED BY '...'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;,再确认防火墙放行3306
源码编译最易被忽略的其实是“一致性”:cmake 时的 -DCMAKE_INSTALL_PREFIX、初始化时的 --basedir、配置文件里的 basedir、systemd 服务文件里的 ExecStart,四个地方路径必须完全一致,差一个字符,mysqld 就找不到插件或配置。建议全程用绝对路径,别依赖相对位置或环境变量。











