CentOS7 mysqldsafe跳过授权表改root密码
机器重启后,MySQL root密码死活想不起来,项目又等着上线,这种抓耳挠腮的时刻谁都可能遇到。别急着重装,CentOS7自带的老牌神器mysqldsafe就能在跳过授权表的情况下,把密码干净利索地重置掉。下面这份手记把每一步都拆到按键级别,照着敲,十分钟内准能重新拿到数据库大门钥匙。

一、先确认环境:别在错误版本上浪费时间
登录终端,输入cat /etc/centos-release,回显若包含“CentOS Linux release 7”,继续;如果是6或8,步骤略有差异,别硬套。接着执行rpm -qa | grep -i mysql-community-server,能看到包名才算安装完成;若返回为空,先yum install -y mysql-community-server装齐再往下走。
二、停库要温柔:强杀后果很严重
很多人直接pkill -9 mysqld,结果InnoDB回滚段损坏,得不偿失。正确姿势是systemctl stop mysqld,等待“Active: inactive (dead)”出现。若停不掉,再执行systemctl status mysqld看哪个子进程卡死,用kill -15 PID给点缓冲,-9留到最后关头。
三、用mysqldsafe跳过授权表:核心命令只有一行
先切换到mysql用户,避免权限膨胀:su - mysql -s /bin/bash。接着启动跳过授权表模式:

/usr/bin/mysqldsafe --skip-grant-tables --skip-networking &
看到“mysqldsafe Starting mysqld daemon with databases from /var/lib/mysql”就表示成功。这里--skip-networking的作用是禁止TCP连接,只允许本地socket,防止重置期间被外部扫到空口令。
四、无密码登录:别用旧习惯敲密码
新窗口直接mysql -u root,回车就能进。此时任何密码字段都被忽略,如果系统提示“Access denied”,八成是mysqldsafe没起来,看错误日志tail /var/log/mysqld.log,把表空间或PID冲突解决再重试。
五、刷新权限表:改密码前必做
登录后先执行FLUSH PRIVILEGES;,告诉服务器现在可以重新加载grant表。跳过这步,后续ALTER USER会报“ERROR 1290”。

六、真正改密码:三条语句任选其一
MySQL5.7与8.0字段名不同,CentOS7默认仓库装的是5.7,用下面这条最稳:
UPDATE mysql.user SET authenticationstring=PASSWORD('新密码') WHERE User='root' AND Host='localhost';若你手痒装了8.0,则改成:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysqlnativepassword BY '新密码';
改完再FLUSH PRIVILEGES;一次,确保内存与磁盘同步。
七、重启验证:别直接生产上线
先systemctl restart mysqld回到正常模式,本地执行mysql -u root -p,输入刚设定的新密码,能进说明成功。此时务必跑一条SHOW VARIABLES LIKE 'validatepassword%';,如果公司策略要求强口令,把长度、复杂度调上去,别让运维同事背锅。
八、远程连接:防火墙与授权双检查
很多开发改完密码后,Navicat依旧连不上,第一反应是“密码没生效”。其实九成是防火墙或MySQL授权表没放通。依次执行:
firewall-cmd --permanent --add-port=3306/tcp\nfirewall-cmd --reload
接着登录MySQL,执行:
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '新密码' WITH GRANT OPTION;
再FLUSH PRIVILEGES;,外网才能敲进来。
九、常见坑汇总:提前避坑省回滚
1. 日志爆满:跳过授权表期间,如果开了generallog,刷几十万条查询会把/var/log撑爆,记得先SET GLOBAL generallog='OFF';
2. SELinux拦截:重启后mysqld起不来,audit2why -a一看是SELinux拒绝,执行setsebool -P mysqlconnectany 1即可。
3. 表空间损坏:异常关机后,InnoDB可能要求恢复,用innodbforcerecovery=3临时启动,把数据导出再重建库。
4. 多实例环境:若机器跑了3307、3308多端口,mysqldsafe --defaults-file=/etc/my3307.cnf --skip-grant-tables指定配置文件,避免改错实例。
十、一键脚本:懒人也能三十秒搞定
把下面脚本保存成resetroot.sh,赋可执行权限,下次直接./reset_root.sh 新密码:
#!/bin/bash\n[ -z \
