MySQL 8.0 在 CentOS 8 上启动或安装失败主因是依赖缺失,需查 libaio、libncurses.so.5(由 ncurses-compat-libs 提供)、libssl.so.10(由 compat-openssl10 提供)等;用 ldd /usr/bin/mysqld | grep "not found" 定位具体缺失项,安装 dnf install -y libaio numactl-libs compat-openssl10 ncurses-compat-libs,禁用 el7 RPM 包,确保 systemd service 正确注册并 reload,SELinux 权限问题需用 semanage 配置上下文。

MySQL 8.0 在 CentOS 8 上启动或安装失败,十有八九是依赖缺失,不是配置写错了,也不是磁盘满了——直接查 libaio、libncurses.so.5、libssl.so.10 这几类库就对了。
查清到底缺哪个库,别猜
报错信息里冒号后面那个名字才是关键。比如:
error while loading shared libraries: libaio.so.1: cannot open shared object file → 缺 libaio
mysql: error while loading shared libraries: libtinfo.so.5 → 实际是 ncurses-compat-libs 提供的兼容层
libssl.so.10 或 libcrypto.so.10 → CentOS 8 默认只有 OpenSSL 1.1.x,得装兼容包 compat-openssl10
验证方法(不依赖 MySQL 是否能跑):
- 运行
ldd /usr/bin/mysqld | grep "not found",看哪些行标红 - 或者用
rpm -qa | grep -E "(libaio|ncurses|openssl)"确认已装版本 - 若
mysqld --version都报错,说明基础依赖链已断裂,优先处理
按系统版本装对的包,别混 el7 和 el8
CentOS 8(及 RHEL 8/Alma/Rocky 8)用的是 dnf,且仓库结构和 el7 不同。官方 RPM 包名带 el7 是故意的“坑”——它不是写错了,而是 MySQL 官方没为 el8 单独打包,你硬装会触发一堆 libssl.so.10 类错误。
正确做法:
- 先删掉误装的 el7 RPM:
rpm -e mysql-community-libs-8.0.*el7.x86_64 - 装 el8 兼容依赖:
dnf install -y libaio numactl-libs compat-openssl10 ncurses-compat-libs - 特别注意:
ncurses-compat-libs是 CentOS 8+ 新增的兼容包,替代旧版libtinfo.so.5和libncurses.so.5,不能用ln -s手动软链凑合
systemd 启动失败时,先确认 mysqld.service 是否真存在
很多报错看着像依赖问题,其实是 service 文件根本没注册。尤其是用 tar.gz 手动部署时,/usr/lib/systemd/system/mysqld.service 常被遗漏。
检查与修复步骤:
- 运行
systemctl list-unit-files | grep mysqld,返回空就说明没注册 - 如果用了官方 RPM 安装但 still not found:执行
rpm -ql mysql-community-server | grep service看路径是否匹配 - 手动补 service 文件?不推荐。更稳的方式是重装 RPM:
dnf reinstall mysql-community-server(它会重建 unit、用户、目录权限) - 改完必须执行
systemctl daemon-reload,否则systemctl start mysqld仍报Unit not found
权限报错如 “Permission denied” 可能是 SELinux 拦的,不是 chmod 没设好
比如 Could not open file mysqld.log for error logging: Permission denied,即使 chown mysql:mysql /var/log/mysqld.log 也无效——大概率是 SELinux 的上下文不对。
快速验证:
- 临时关闭 SELinux:
setenforce 0,再试systemctl start mysqld。如果成功,就是它 - 永久放行(生产环境用):
semanage fcontext -a -t mysqld_log_t "/var/log/mysqld\.log",然后restorecon -v /var/log/mysqld.log - 别漏掉数据目录:
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"(若自定义了datadir)
SELinux 规则一旦配错,比依赖缺失更难排查——因为它不报具体缺什么,只默默拒绝访问。


















