不能直接在配置文件加skip-grant-tables重启服务,因MySQL 5.7+不支持该配置项生效或导致启动失败;单独运行mysqld --skip-grant-tables需配合--skip-networking并确认进程真实启动,登录后须用ALTER USER修改密码、FLUSH PRIVILEGES刷新权限,并彻底终止临时进程再正常启动服务。

不能直接在配置文件里加 skip-grant-tables 然后重启服务——这样会导致 MySQL 启动失败或静默跳过权限校验但无法执行密码修改语句。
为什么 mysqld --skip-grant-tables 单独启动会卡住或失败?
Linux/macOS 下运行 mysqld --skip-grant-tables --skip-networking & 后终端“没反应”,是正常现象:进程已在前台驻留,不是卡死。此时若 Ctrl+C 或关窗口,进程就终止了;必须另开终端去连。
Windows 下用管理员 CMD 运行 mysqld --console --skip-grant-tables --shared-memory,该窗口必须保持打开——它就是主进程,关闭即退出服务。
常见失败原因包括:
-
mysqld进程根本没起来:用ps aux | grep mysqld(Linux/macOS)或tasklist | findstr mysqld(Windows)确认 - 端口被占或
datadir路径错误:检查my.cnf或my.ini中的port和datadir配置 - 只加了
--skip-grant-tables没加--skip-networking:MySQL 仍监听 TCP 端口,存在本地任意用户直连风险
登录后执行 UPDATE 修改 authentication_string 为何总不生效?
MySQL 5.7 的密码字段是 authentication_string,不是 password。写错字段名不会报错,但修改完全无效。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
必须同时满足以下条件才能让新密码真正可用:
- UPDATE 语句中
WHERE条件要精确匹配:User = 'root'且Host = 'localhost'('root'@'127.0.0.1'是另一条独立记录) - 必须显式执行
FLUSH PRIVILEGES;,否则修改仅写入磁盘,未加载进内存权限系统 - 不要用
SET PASSWORD或UPDATE ... SET password = ...:这些在 5.7.6+ 已废弃,行为不可靠 - 推荐优先用
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123';,它自动适配认证插件、生成合规哈希
改完密码后为什么还是免密可登录?
这是最常被忽略的收尾动作:你手动起的 mysqld --skip-grant-tables 进程仍在后台运行,占着 3306 端口。此时执行 systemctl start mysqld,实际启动的是另一个实例,但你连接的仍是那个跳过权限的老进程。
正确做法是:
- 改完密码并执行
FLUSH PRIVILEGES;后,先exit退出 MySQL 客户端 - 在原启动窗口(Linux/macOS)或管理员 CMD(Windows)中,用
killall mysqld(Linux/macOS)或taskkill /f /im mysqld.exe(Windows)彻底终止进程 - 再用标准方式启动服务:
systemctl start mysqld(Linux systemd)或net start mysql(Windows 服务) - 验证:用
mysql -u root -p输入新密码登录,确保旧密码和空密码均不可用
整个过程的关键不在“怎么改密码”,而在于启动方式是否真正绕过权限加载、修改是否命中正确记录、以及是否彻底清理临时进程——漏掉任一环,都会导致看似成功实则无效。

















