mysql 5.7+ 修改其他用户密码应使用 alter user 'username'@'host' identified by 'new_password';,需具备 create user 或 update 权限,自动刷新权限,无需 flush privileges;注意 host 匹配(如 'localhost' ≠ '127.0.0.1'),并满足 validate_password 策略要求。

MySQL 5.7+ 中用 ALTER USER 修改其他用户密码
MySQL 5.7 及以后版本默认禁用 UPDATE mysql.user 直接改密码字段,必须用权限安全的语句操作。你得有 CREATE USER 或 UPDATE 权限(通常需 root 或具备 mysql.session 角色的账户)。
执行前先确认目标用户存在且不是系统保留账户(如 mysql.infoschema),否则会报错 ERROR 1396 (HY000): Operation ALTER USER failed for 'xxx'@'%' 。
- 基本语法:
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password'; - 如果用户只允许从本地登录,
host通常是'localhost',不是'127.0.0.1'(二者在 MySQL 中视为不同主机) - 修改后无需手动
FLUSH PRIVILEGES——ALTER USER会自动刷新权限表 - 若提示
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,说明启用了validate_password插件,需提高密码复杂度(如含大小写字母+数字+符号,长度 ≥ 8)
MySQL 5.6 及更早版本用 SET PASSWORD 或 UPDATE
老版本不支持 ALTER USER,但直接更新 mysql.user 表风险高:字段名随版本变化(如 password → authentication_string),且容易漏掉 FLUSH PRIVILEGES 导致修改不生效。
推荐优先用 SET PASSWORD,它自动处理哈希和字段映射:
-
SET PASSWORD FOR 'username'@'host' = PASSWORD('new_password');(MySQL 5.7.5 前有效) - MySQL 5.7.6+ 已弃用
PASSWORD()函数,应改用SET PASSWORD ... = 'hash_value'或退回ALTER USER - 若坚持用
UPDATE,必须同时更新authentication_string字段,并确保用SHA2('pwd',256)或OLD_PASSWORD()(仅兼容旧客户端)生成哈希值,否则登录会失败
忘记 root 密码时的特殊处理流程
这不是“修改其他用户密码”,而是绕过权限验证重置 root。必须停掉 MySQL 服务,用 --skip-grant-tables 启动,此时所有用户可无密码登录,但所有权限检查被跳过 —— 所以只能连本地 socket,且不能执行 DDL(如 CREATE DATABASE)。
- 启动命令示例:
mysqld --skip-grant-tables --skip-networking & - 连上后先执行
FLUSH PRIVILEGES;,再用ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; - 切记重启服务前删掉
--skip-grant-tables参数,否则数据库完全裸奔 - 某些发行版(如 Ubuntu 的
mysql-server包)会启用auth_socket插件,此时root默认不走密码认证,需先查SELECT plugin FROM mysql.user WHERE User='root';,再决定用ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'xxx'
常见失败原因和验证方式
改完密码却仍连不上?别急着重试,先查几个关键点:
- 连接时指定的
host是否和用户定义中的一致?mysql -u user -h 127.0.0.1 -p和mysql -u user -h localhost -p可能匹配不同用户行 - 用
SELECT User,Host,plugin,authentication_string FROM mysql.user WHERE User='username';确认密码已更新、插件类型正确(如mysql_native_password而非auth_socket) - 客户端是否启用了
--default-auth=mysql_native_password?特别是 MySQL 8.0+ 默认用caching_sha2_password,旧客户端不支持 - 防火墙或 SELinux 是否拦截了连接?错误信息是
Can't connect to MySQL server还是Access denied很关键
跨版本迁移或升级后首次改密,最容易卡在插件不兼容或 host 匹配逻辑变化上,建议先在测试库跑通再操作生产环境。











