必须先停止mysql服务再执行mysqld_safe --skip-grant-tables,否则因残留进程导致命令失效;启动时须同时加--skip-networking防未授权访问,并按版本正确修改authentication_string字段或用alter user重置密码,最后删配置中skip-grant-tables并重启服务。

安全模式启动前必须停掉 MySQL 服务
直接执行 mysqld_safe --skip-grant-tables 不会生效,如果 mysqld 进程已在运行,新命令会被拒绝或静默失败。必须先彻底终止现有服务:
- 用
sudo systemctl stop mysql(主流发行版)或sudo service mysqld stop(CentOS/RHEL 旧版) - 验证是否真停了:
ps aux | grep mysqld,输出中不应有mysqld或mysqld_safe进程 - 别跳过这步——残留进程会导致后续无法无密码登录,或修改后权限不刷新
启动安全模式时要加 --skip-networking
只加 --skip-grant-tables 很危险:MySQL 仍监听 3306 端口,任何局域网用户都能连上并改库。生产环境务必加上 --skip-networking 关闭网络连接:
- 正确命令:
sudo mysqld_safe --skip-grant-tables --skip-networking & - 启动后看日志确认:
tail -f /var/log/mysql/error.log或/var/log/mariadb/mariadb.log,应出现mysqld: ready for connections - 若卡在
Starting mysqld daemon with databases from ...,说明启动失败,常见原因是配置文件冲突或端口被占
登录后改密码必须匹配 MySQL 版本字段名
MySQL 5.7 起 password 字段已移除,硬写 UPDATE user SET password = ... 会报 ERROR 1054 (42S22)。必须按版本选字段和语法:
- MySQL 5.7:用
authentication_string字段 +PASSWORD()函数:UPDATE mysql.user SET authentication_string = PASSWORD('newpass123') WHERE User = 'root' AND Host = 'localhost'; - MySQL 8.0+:
PASSWORD()已废弃,必须用ALTER USER:ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass123!';(注意密码需含大小写字母、数字、特殊符号) - 无论哪种方式,
FLUSH PRIVILEGES;必须执行,否则修改不生效
退出安全模式后要清理配置并重启服务
如果之前为图省事在 /etc/my.cnf 里加了 skip-grant-tables,现在必须删掉它再重启,否则 MySQL 永远处于无权限验证状态:
- 编辑配置:
sudo vi /etc/my.cnf,定位到[mysqld]段,删掉skip-grant-tables和skip-networking行 - 重启服务:
sudo systemctl restart mysql(不要用start,避免残留进程) - 验证新密码:
mysql -u root -p,输入新密码;失败则检查错误日志,常见原因是没执行FLUSH PRIVILEGES或主机名不匹配(如用了'root'@'%'却连的是localhost)
skip-grant-tables 是最常被忽略的点——它会让数据库长期裸奔,比密码弱更危险。











