mysql用户密码如何修改_mysql用户认证设置

来源:这里教程网 时间:2026-02-28 20:48:36 作者:

MySQL 8.0+ 修改用户密码用
ALTER USER
,不是
SET PASSWORD

MySQL 8.0 开始默认使用

caching_sha2_password
插件认证,
SET PASSWORD
在多数配置下已失效或被拒绝。直接执行会报错:
ERROR 1064 (42000): You have an error in your SQL syntax
或更常见的
ERROR 1396 (HY000): Operation ALTER USER failed
(尤其对 root 用户未显式指定主机时)。

正确做法是明确指定用户名和主机,并用

ALTER USER

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

注意点:

'root'@'localhost'
中的主机部分不能省略;用
SELECT User, Host FROM mysql.user;
查清实际账户的完整用户名+主机组合
密码必须满足当前密码策略(如
validate_password
插件启用时要求大小写字母+数字+特殊字符)
改完后需执行
FLUSH PRIVILEGES;
(虽然
ALTER USER
通常自动刷新,但某些旧版本或权限缓存异常时仍需手动刷)

MySQL 5.7 及更早版本可用
SET PASSWORD
,但要注意语法差异

在 MySQL 5.7 中,

SET PASSWORD
仍有效,但格式与旧版不同:必须带
FOR
子句,且不能省略主机名。

SET PASSWORD FOR 'admin'@'%' = 'new_pass_123';

常见翻车点:

写成
SET PASSWORD = PASSWORD('xxx')
—— 这是 MySQL 5.6 及之前语法,5.7+ 已废弃,会报错
ERROR 1372 (HY000)
漏掉
@'host'
,例如只写
SET PASSWORD FOR 'user' = ...
→ 报错
ERROR 1396
UPDATE mysql.user
直接改
authentication_string
字段 —— 极易因加密方式不匹配导致锁死账户(尤其跨版本升级后)

修改用户认证插件类型要同步重设密码

如果想把

caching_sha2_password
改回
mysql_native_password
(比如适配老客户端),不能只改插件,必须同时重置密码,否则认证失败。

ALTER USER 'app_user'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'legacy_compat_pwd';

关键逻辑:

认证插件和密码哈希值绑定存储,换插件 ≠ 自动转密码格式
mysql_native_password
用的是 SHA1 哈希,而
caching_sha2_password
是 SHA256 + salt,二者不可互译
若只执行
ALTER USER ... IDENTIFIED WITH mysql_native_password;
不带
BY
,新密码字段为空,登录时会提示
Access denied for user

忘记 root 密码时绕过认证的实操要点

唯一安全可行的方式是用

--skip-grant-tables
启动 mysqld,但必须配合
--skip-networking
防止未授权访问。

步骤简述(Linux):

停掉 MySQL:
sudo systemctl stop mysql
临时启动跳过权限检查:
sudo mysqld --skip-grant-tables --skip-networking &
连入后立即重设密码:
UPDATE mysql.user SET authentication_string=PASSWORD('new_root') WHERE User='root'; FLUSH PRIVILEGES;
(5.7)或用
ALTER USER
(8.0+)
杀掉进程并正常重启:
sudo killall mysqld
sudo systemctl start mysql

注意:

--skip-grant-tables
下所有用户免密可登录,务必确保无网络暴露、操作时间尽量短——这是高危操作,不是日常维护手段。

相关推荐