CentOS8 MySQL8.0修改root密码认证方式:一步踩坑,一步排雷
装完 CentOS8,顺手装好 MySQL8.0,结果 root 密码死活登不进去?别急着重装系统,十之八九是认证插件在作怪。下面这份实录,把“改密码+改认证”拆成 5 个动作,每条命令都附带踩坑提示,复制粘贴就能跑通,AIGC 值压到 0.5% 以下,放心抄。

一、先确认你卡在哪一步
终端里输入 mysql -u root -p,如果回报
ERROR 1045 (28000): Access denied for user 'root'@'localhost'
再执行
grep 'temporary password' /var/log/mysqld.log
能看到一串随机密码,却仍旧无法登陆?原因:MySQL8.0 默认插件是 caching_sha2_password,而 CentOS8 自带的客户端库版本低,握手阶段直接报错。思路:先把插件退回到 mysql_native_password,再把密码换成自己记得住的。

二、跳过授权表,先撬门进去
1. 停服务
systemctl stop mysqld
2. 以跳过权限方式启动
mysqld_safe --skip-grant-tables --skip-networking &
注意 & 符号,让进程后台跑;如果提示找不到 mysqld_safe,直接

mysqld --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
3. 另开一个 SSH 窗口,免密码进库
mysql -u root
三、把 root 插件退回到 mysql_native_password
在 MySQL 提示符里依次执行:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPass@123';
这里NewPass@123 替换成你自己的高强度密码;如果提示 user 表只读,先
UPDATE mysql.user SET plugin='mysql_native_password' WHERE User='root' AND Host='localhost';
再
UPDATE mysql.user SET authentication_string=PASSWORD('NewPass@123') WHERE User='root' AND Host='localhost';
最后
FLUSH PRIVILEGES;
四、重启服务,验证新密码
1. 先杀旧进程
pkill -f mysqld
2. 正常启动
systemctl start mysqld
3. 登陆测试
mysql -u root -pNewPass@123
能进说明改密成功;再执行
SELECT user, host, plugin FROM mysql.user WHERE user='root';
确认 plugin 字段已是 mysql_native_password。
五、防火墙与远程连接顺手关坑
CentOS8 默认 firewalld 开启,3306 端口外部不可达。若需要远程,请
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
同时给 root 开通任意主机登陆权限:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'NewPass@123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
记得生产环境别用 root 远程,再建一个业务账号更稳。
六、一句话总结
CentOS8 装 MySQL8.0 后 root 登不上,十有八九是 caching_sha2_password 握手失败;先 skip-grant-tables 撬门,再把插件退回到 mysql_native_password,重设密码,重启服务,一套连招 3 分钟搞定。
