能重置,但必须分清MySQL版本和启动方式:5.7+用authentication_string字段和ALTER USER语句,5.5及更早用password字段;Linux推荐mysqld_safe --skip-grant-tables &启动,Windows宜修改my.ini添加skip-grant-tables并重启服务。

能重置,但必须分清 MySQL 版本和启动方式,否则执行 UPDATE 会报错或密码不生效。
MySQL 5.7+ 必须用 authentication_string 字段更新密码
5.5 及更早版本用 password 字段,5.7 开始废弃该字段,改用 authentication_string 存储哈希值。直接沿用旧 SQL 会导致修改无效:
-
UPDATE user SET password=PASSWORD('123') WHERE user='root';—— 在 5.7+ 中不报错但不生效 - 正确写法是:
UPDATE user SET authentication_string=PASSWORD('123') WHERE user='root' AND host='localhost'; - 如果提示
PASSWORD() is deprecated,说明已禁用该函数(如 MySQL 8.0+),此时应改用ALTER USER语句
Linux 下用 mysqld_safe --skip-grant-tables & 启动最稳妥
不是所有系统都自带 safe_mysqld,但 mysqld_safe 是官方推荐的 wrapper 脚本,能自动处理 pid、日志、权限等细节:
- 先停服务:
sudo systemctl stop mysqld或sudo service mysql stop - 后台启动跳过权限验证:
sudo mysqld_safe --skip-grant-tables & - 另开终端连库:
mysql -u root(此时不输密码,直接回车) - 注意:若提示
Can't connect to local MySQL server,大概率是 mysqld_safe 没真正跑起来,检查错误日志(通常在/var/log/mysqld.log)
Windows 下改 my.ini 比命令行更可靠
Windows 没有稳定的 mysqld_safe,直接运行 mysqld --skip-grant-tables 容易卡住或被 Windows 服务管理器干扰:
- 找到
my.ini(常见路径:C:\ProgramData\MySQL\MySQL Server X.X\my.ini或安装目录下) - 在
[mysqld]段落下新增一行:skip-grant-tables - 保存后以管理员身份运行:
net stop mysql→net start mysql - 然后打开新 cmd,执行
mysql -u root -p,密码处直接回车即可登录 - 改完密码后务必删掉
my.ini里的skip-grant-tables行,并重启服务,否则数据库始终无权限控制
FLUSH PRIVILEGES 在跳过授权模式下不是必须的,但加了更安全
当 MySQL 以 --skip-grant-tables 启动时,权限表根本不加载,所以 UPDATE user 写入的是磁盘数据,不是内存缓存。此时执行 FLUSH PRIVILEGES 不会出错,但实际没作用:
- 它只在正常启动状态下刷新内存中的权限缓存
- 不过加上也无害,且能避免你误以为“没刷新所以密码没生效”而重复操作
- 真正关键的是:改完密码后必须退出 MySQL、停止 mysqld(或重启 Windows 服务),再以常规方式启动,否则新密码不会被校验
最容易被忽略的一点:MySQL 8.0 默认使用 caching_sha2_password 插件,PASSWORD() 函数返回的哈希格式不兼容。如果遇到“Access denied”且确认密码没错,大概率是认证插件不匹配——这时得用 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; 显式指定插件。


















