必须添加Oracle官方YUM源并禁用MariaDB模块才能安装MySQL 8.0;首次启动失败需检查journal日志、手动初始化数据目录并修复SELinux上下文;登录需用临时密码并切换为mysql_native_password插件;远程连接须同时配置bind-address、防火墙及权限。
MySQL 在 CentOS/RHEL 系统上用 YUM 安装看似简单,但默认仓库常提供旧版 mysql(其实是 MariaDB 替代包),或安装后无法启动、密码失效、远程连不上——这些问题不是配置错了,而是没绕过几个关键陷阱。
很多系统运行 yum install mysql 实际装的是 mariadb-server,它和 MySQL 兼容但版本号、默认配置、密码策略、服务名都不同。想用官方 MySQL,必须先添加 Oracle 的 YUM 仓库:
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm(注意
el7-3 要按你的系统版本选,如 CentOS 8 用 el8)mariadb 模块(CentOS 8+):sudo dnf module reset mysql
sudo dnf module enable mysql:8.0
sudo yum repolist enabled | grep mysql应看到
mysql80-community
Failed to start mysqld.service
常见原因是初始化数据目录失败,或 SELinux 拦截。不要直接删 /var/lib/mysql 重来——先看日志:
sudo journalctl -u mysqld --since "1 hour ago" | tail -20
Can't open the mysql.plugin table 或 Table 'mysql.plugin' doesn't exist:说明初始化未完成,手动触发:sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql
sudo setenforce 0,若此时能启动,说明需修复上下文:
sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?" && sudo restorecon -Rv /var/lib/mysql
/var/lib/mysql 所属用户是 mysql:mysql:sudo chown -R mysql:mysql /var/lib/mysql
Access denied 或 plugin caching_sha2_password
MySQL 5.7+ 默认生成临时密码,且 8.0 默认用 caching_sha2_password 插件,老客户端不支持。别急着改配置文件:
sudo grep 'temporary password' /var/log/mysqld.log(注意大小写敏感)
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123';
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
即使开了 3306 端口,MySQL 也可能只监听本地。三处必须同时检查:
/etc/my.cnf,在 [mysqld] 下确保没有 skip-networking,且 bind-address 是 0.0.0.0 或具体 IP(不是 127.0.0.1)sudo systemctl restart mysqld
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload
sudo ss -tlnp | grep :3306输出
应含 *:3306,而非 127.0.0.1:3306
真正卡住的地方,往往不是某一步做错了,而是多个环节叠加:比如用了官方 repo 却没禁用 mariadb 模块,导致 yum 装了两个冲突的服务;或者改了 bind-address 却忘了关 SELinux 上下文,结果日志里只报 “Permission denied” 而不提具体路径。动手前,先 journalctl -u mysqld 看一眼,比瞎试十次都管用。