CentOS7忘记MySQL root密码五分钟重置记录
一、先别慌,先确认服务状态

CentOS7忘记MySQL root密码的第一件事不是百度,而是先确认MySQL服务有没有在跑。敲这条命令:
systemctl status mysqld
如果看到绿色active (running),说明实例活着,待会儿直接安全模式就能改;如果服务没启动,先systemctl start mysqld,省得后面操作卡住。确认完状态,再把SELinux临时放宽松:
setenforce 0
这条只是临时,重启失效,防止权限拦截导致重置失败。
二、备份是底线,别嫌麻烦

有人觉得“我五分钟就能改完,备份太耽误事”。等真把库敲坏了,哭都来不及。用一条极简命令把数据目录打包:
tar -zcf /opt/mysql_all_$(date +%m%d%H%M).tar.gz /var/lib/mysql
整个目录压成压缩包,30秒搞定,真出事直接解压回滚,比任何后悔药都香。
三、进安全模式,跳过授权表
CentOS7下MySQL 5.7及以上版本默认带--skip-grant-tables策略,用安全模式启动就能绕过密码验证。先停掉正常服务:
systemctl stop mysqld

再手动前台启动安全实例:
mysqld_safe --skip-grant-tables --skip-networking &
注意后面加&丢后台,省得终端一直挂着。此时任何本地用户都能无密码登录,别离开机器,防止被同事恶作剧。
四、无密码登录,改表刷新权限
开新终端,直接mysql回车就能进。依次敲下面四行,**一气呵成别中断**:
use mysql;
update user set authentication_string=password('新密码') where user='root';
flush privileges;
quit;
关键点:MySQL 5.7以后字段叫authentication_string,老版本才是password,抄错字段会提示0行受影响,密码等于没改。flush那一步必须做,否则退出后新密码不生效。
五、重启服务,验证新密码
先杀掉刚才的mysqld_safe进程:
pkill -9 mysqld
再用官方服务脚本启动:
systemctl start mysqld
登录测试:
mysql -uroot -p'新密码'
能进说明成功。如果提示Access denied,八成是update语句拼错或者没flush,重新走一遍安全模式即可。
六、把SELinux、防火墙原样加回来
前面setenforce 0只是临时,改完密码记得恢复:
setenforce 1
防火墙若开了3306端口,记得再测试一次远程连接,防止端口被防火墙回收导致业务中断。
七、五分钟计时真的够吗?
实测在2核4G的CentOS7虚拟机里,从停服务到重启验证,**整流程3分40秒**。瓶颈主要在tar备份那一步,磁盘快的话还能再省30秒。真正手敲命令时间不到90秒,五分钟绰绰有余。
八、常见翻车点汇总
- 复制粘贴带换行符,导致mysql命令行直接执行一半,结果表没改完;
- 密码里带特殊符号,没加单引号,shell把
!当成历史命令展开,直接报错; - 同时装了MariaDB,systemctl启动的是mariadb服务,结果改完密码发现库不是同一套;
- 用了
--skip-networking却忘记关,导致远程业务连不上,还以为密码改坏了。
九、后续加固,别再丢密码
改完立刻在/root/.my.cnf里写:
[client]
user=root
password=新密码
文件权限改成600,脚本里就能免密登录,日常备份、定时任务再也不用交互。再配个密码管理器,把root密码丢进去,半年换一次,基本告别“忘记”二字。
十、小结:四步口诀背下来
停服务、备数据、安全模式改表、重启验证。十二个字,背下来比任何教程都靠谱。下次再遇到CentOS7忘记MySQL root密码,直接翻这条记录,五分钟完事,还能在同事面前秀一波操作。
