MySQL 在 CentOS/RHEL 系统上用 YUM 安装看似简单,但默认仓库常提供旧版
mysql(其实是 MariaDB 替代包),或安装后无法启动、密码失效、远程连不上——这些问题不是配置错了,而是没绕过几个关键陷阱。
确认你装的是 Oracle 官方 MySQL,不是 MariaDB
很多系统运行
yum install mysql实际装的是
mariadb-server,它和 MySQL 兼容但版本号、默认配置、密码策略、服务名都不同。想用官方 MySQL,必须先添加 Oracle 的 YUM 仓库: 下载并安装官方 repo 包:
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启用 MySQL 8.0 模块(可选,但推荐明确指定):
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/mysqlSELinux 拒绝访问?临时验证:
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
登录不了 root:空密码、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立刻改密码并换认证插件(否则 Navicat、PHP 7.4 以下会连不上):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123';如果要允许远程 root 登录(仅测试环境):
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
远程连接被拒:防火墙、bind-address、skip-networking
即使开了
3306端口,MySQL 也可能只监听本地。三处必须同时检查: 确认 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看一眼,比瞎试十次都管用。
