必须停服务、加--skip-networking、改authentication_string字段、执行FLUSH PRIVILEGES,四步缺一不可;因mysqld_safe已弃用且不默认禁网,MySQL 5.7废弃password字段,authentication_string需匹配host,FLUSH PRIVILEGES必须执行以加载新密码至内存。

必须停服务、加 --skip-networking、改 authentication_string 字段、执行 FLUSH PRIVILEGES,四步缺一不可。跳过任意一步,要么密码不生效,要么数据库裸奔。
为什么不能只用 mysqld_safe --skip-grant-tables
新版系统中 mysqld_safe 已被弃用,直接调用 mysqld 更稳定;更重要的是,mysqld_safe 默认不带 --skip-networking,端口 3306 仍对外暴露——本地局域网内任何机器都能无密码连进来,等于把生产库大门敞开。
- Linux 下应使用:
sudo mysqld --skip-grant-tables --skip-networking & - 启动后立刻用
ps aux | grep "skip-grant"确认进程在跑,别关终端窗口(它就是 mysqld 进程本身) - 如果提示端口占用,说明原 mysqld 没停干净,先执行
sudo systemctl stop mysqld(CentOS/RHEL)或sudo systemctl stop mysql(Ubuntu/Debian)
UPDATE user SET password = ... 会报错
MySQL 5.7 完全废弃了 password 字段,硬写会导致 Unknown column 'password' in 'field list'。必须操作 authentication_string,且要严格匹配 host 条件。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 正确语句:
UPDATE user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost'; - 漏掉
AND host = 'localhost'可能命中root@127.0.0.1或root@%,改错账户 - 别用
SET PASSWORD或ALTER USER:5.7.6 之前版本不支持这些语法,执行会报错ERROR 1064
FLUSH PRIVILEGES 不是可选项
它不是“顺便刷一下”,而是把刚写入磁盘的 authentication_string 值加载进内存权限缓存。不执行,新密码永远不生效——你改完退出、重启服务,登录还是旧密码或拒绝访问。
- 必须在 MySQL 客户端内执行:
FLUSH PRIVILEGES;(注意分号) - 改完后别急着重启,先手动杀掉跳过权限的 mysqld 进程:
sudo pkill mysqld或sudo killall mysqld - 检查
/etc/my.cnf或my.ini是否误留了skip-grant-tables=1,有则删掉或注释
整个过程最易被跳过的其实是 --skip-networking 和 FLUSH PRIVILEGES。前者关乎安全,后者关乎功能,两者都藏在命令行参数和 SQL 语句末尾,容易扫一眼就略过。

















