--skip-grant-tables必须与--skip-networking同时使用,否则数据库将完全暴露于网络;修改密码须按版本选用ALTER USER(8.0+)或UPDATE语句(5.7),并执行FLUSH PRIVILEGES;操作后须彻底终止跳过权限的mysqld进程再正常重启服务。

用 --skip-grant-tables 启动 MySQL 必须加 --skip-networking
不加 --skip-networking 就启动跳过权限验证的 mysqld,等于把数据库大门敞开——任何能连上这台机器网络的人,都可以无密码登录 root。这不是“临时方案”,是直接暴露生产风险。
正确做法是两个参数必须同时出现:
sudo mysqld_safe --skip-grant-tables --skip-networking &- 或更显式地:
sudo mysqld --skip-grant-tables --skip-networking --user=mysql &
验证是否生效:运行 netstat -tlnp | grep :3306,应无输出;再查进程:ps aux | grep "skip-grant",确认两个参数都在命令行里。
MySQL 5.7 和 8.0+ 的密码修改语句不能混用
执行 ALTER USER 前,先确认版本:mysql --version 或登录后查 SELECT VERSION();。错用语句会导致语法错误或密码不生效。
版本对应操作:
- MySQL 8.0+:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - MySQL 5.7:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost'; - 无论哪个版本,改完都必须执行:
FLUSH PRIVILEGES;
注意:PASSWORD() 函数在 8.0+ 已移除,硬套会报错 FUNCTION xxx.PASSWORD does not exist;而 5.7 用 ALTER USER 可能提示 Unknown column 'password_last_changed' in 'mysql.user'。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
退出前务必杀掉跳过权限的 mysqld 进程,再正常启服务
常见错误是执行完 EXIT 就直接 systemctl start mysqld,结果系统里同时跑着两个 mysqld 实例:一个是带 --skip-grant-tables 的旧进程,另一个是正常启动的新服务——端口冲突、数据文件被锁、甚至写入损坏。
安全退出流程:
- 在 MySQL 客户端内执行:
EXIT; - 回到终端,杀掉跳过权限的进程:
sudo killall mysqld(或更精准:sudo pkill -f "mysqld.*skip-grant") - 确认清理干净:
ps aux | grep mysqld应只显示空行或无关进程 - 再启动:
sudo systemctl start mysqld
最后用 mysql -u root -p 测试新密码,别跳过这步——有些情况下 FLUSH PRIVILEGES 并未真正持久化,重启后密码还是旧的。
Windows 下别依赖服务名,优先用 mysqld --console 调试
Windows 上 net stop mysql 经常失败,因为服务名可能是 mysql80、MySQL57 或自定义名,查不到就卡住。更可靠的方式是手动终止进程 + 控制台模式启动。
操作要点:
- 任务管理器结束所有
mysqld.exe进程 - 进 MySQL 的
bin目录(如C:\Program Files\MySQL\MySQL Server 8.0\bin) - 运行:
mysqld --skip-grant-tables --skip-networking --console - 另开命令行:
mysql -u root——此时窗口不会退出,--console让日志直出,便于发现启动失败原因(比如端口被占、配置文件路径错)
这个方式绕过了 Windows 服务注册表的不确定性,适合所有 MySQL 8.x 版本,也避免了因服务权限导致的 Access denied 报错。

















