游乐游手机版
首页/数据库/文章详情

如何在MySQL命令行中安全修改其他用户密码

时间:2026-06-24 07:48
MySQL5 7 6+推荐ALTERUSER修改密码,需CREATEUSER或UPDATE权限,避免修改系统账户。主机名需精确匹配,密码须符合validate_password策略。不推荐SETPASSWORD和mysqladmin,直接修改mysql user表已禁用。

在 MySQL 5.7.6 及以上版本中,修改其他用户密码的官方推荐操作路径是 ALTER USER。相比直接修改 mysql.user 表或使用 PASSWORD() 函数,这种方式更安全、更规范,并且会自动刷新权限,省去了手动执行 FLUSH PRIVILEGES 的步骤。不过,它有一些硬性门槛:你需要拥有 CREATE USERUPDATE 权限;目标用户不能是系统保留账户(如 mysql.infoschemamysql.session),否则会报错 ERROR 1396 (HY000)。此外,host 必须精确匹配——'user'@'localhost''user'@'127.0.0.1' 是两个完全不同的账户,查不到就会报错。密码还必须符合 validate_password 策略,否则无法通过。

怎样在MySQL中通过命令行安全地修改其他用户密码?

ALTER USER 是唯一推荐的密码修改方式

从 MySQL 5.7.6 开始,直接更新 mysql.user 表已被禁止,PASSWORD() 函数也被废弃。官方唯一推荐的正规途径就是 ALTER USER——它会自动刷新权限表,无需手动执行 FLUSH PRIVILEGES,也完全不用担心字段名变化(例如从 password 改为 authentication_string)导致脚本崩溃。

但执行 ALTER USER 需要满足两个前提:第一,你必须拥有 CREATE USER 权限,或者对 mysql 库的 UPDATE 权限;第二,目标用户不能是系统保留账户(比如 mysql.infoschemamysql.session),否则会遇到熟悉的 ERROR 1396 (HY000)

  • ALTER USER 'app_user'@'192.168.1.100' IDENTIFIED BY 'P@ssw0rd2026!';
  • 主机名必须精确匹配:'app_user'@'localhost' 不等于 'app_user'@'127.0.0.1',如果找不到用户,会直接报错
  • 如果用户不存在,请先用 CREATE USER 创建账户,再通过 ALTER USER 设置密码

SET PASSWORD 已退居次要地位,使用时需谨慎

SET PASSWORD FOR 在 MySQL 8.0+ 中仍然可用,但仅限于拥有 UPDATE 权限的用户操作,而且不再支持 PASSWORD() 函数——直接传入明文密码即可:

  • SET PASSWORD FOR 'reporter'@'%' = 'N3wR3p0rtP@ss!';
  • 如果是 MySQL 5.7.5 及更早版本,才支持 = PASSWORD('xxx') 写法,新版这样写会报 ERROR 1064
  • 这条语句不会自动刷新权限表,执行后必须立即跟上 FLUSH PRIVILEGES;,否则新密码不会生效
  • 不建议在自动化脚本中使用,因为它在不同小版本之间的行为并不稳定

validate_password 插件常导致 ERROR 1819

默认情况下,该插件是开启的。如果密码不满足策略要求,ALTER USER 会直接失败,并提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

先检查当前的策略级别:SELECT @@validate_password.policy;(0 代表 LOW,1 代表 MEDIUM,2 代表 STRONG)

  • MEDIUM 级别要求:密码长度 ≥ 8,并且包含大小写字母、数字、特殊字符
  • 如果只是在调试环境临时绕过,可以执行 SET GLOBAL validate_password.policy = LOW;,但生产环境中千万别这么做
  • 避免使用纯数字、常见单词或重复字符,例如 12345678password123

mysqladmin 不适合修改其他用户密码

mysqladmin -u root -p password 'new' 这个命令只能修改当前连接用户的密码(即 USER() 函数返回的账户),无法指定目标账号。如果试图用它修改 app_user 的密码,实际上修改的是你登录时所用的账户——比如 root,这是典型的误用场景。

它本质上是封装了 SET PASSWORD = 'xxx',仅作用于当前会话上下文。

  • 要批量修改多个用户的密码?还是老老实实进入 MySQL 客户端,逐条执行 ALTER USER
  • 在脚本中调用 mysqladmin 之前,务必确认 -u 指定的正是你要修改密码的那个用户本身
  • 它不校验 host,也不处理 validate_password,很容易隐藏真正的问题

实际操作中最容易忽略的,就是 host 字符串的精确性。'user'@'localhost''user'@'%' 是两个完全独立的账户,权限、密码甚至是否启用都互不影响。连错了 host,即使语法完全正确,也会提示用户不存在——这个坑,不少人都踩过。

来源:https://www.php.cn/faq/2676292.html
上一篇如何在MySQL数据库中使用CASE WHEN语句实现复杂条件判断逻辑 下一篇phpMyAdmin导入SQL报错无效参数的原因与解决方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
金仓数据库逻辑备份实战:全库导出与模式替换全流程
数据库 · 2026-07-03

金仓数据库逻辑备份实战:全库导出与模式替换全流程

在长期的运维实践中,我越来越体会到,备份就像一份保险——平时看似无用,但关键时刻却是唯一的救命稻草。逻辑备份看似简单,可真正执行恢复时,各种陷阱接连浮现:表名大小写不一致、Schema 未正确切换、Owner 属性未同步修改……任何一个环节处理不当,最终恢复出的数据库就会与预期相去甚远。 本文将深入

金仓数据库sys_rman物理备份全流程演练与误覆盖恢复
数据库 · 2026-07-03

金仓数据库sys_rman物理备份全流程演练与误覆盖恢复

干运维这行,逻辑备份和物理备份我都接触过,但说句实在话,真正能在生产环境里扛住事儿的,还得是物理备份。逻辑备份导出的是 SQL 语句,数据量一大,那速度慢得让人抓狂,而且最关键的是,它没法做时间点恢复。物理备份不一样,它直接拷贝数据文件,再配上 WAL 归档日志,想恢复到过去哪一秒都行,这是它最硬核

Windows下将MySQL注册为系统自启服务教程
数据库 · 2026-07-03

Windows下将MySQL注册为系统自启服务教程

先说一个关键前提:务必以管理员身份运行终端,否则 mysqld --install 这条命令几乎不可能成功。问题不在于命令写错,而是 Windows 系统的用户账户控制(UAC)机制会在中途拦截——在普通 CMD 或 PowerShell 窗口执行这条命令,要么直接提示 Access is deni

Mac版Navicat中快速对比两个数据库的表结构异同
数据库 · 2026-07-03

Mac版Navicat中快速对比两个数据库的表结构异同

直接说结论:Mac 版 Navicat 和 Windows 版在表结构比对逻辑上完全一致。但默认配置下,它确实无法承受“全库一键比对上万张表”的压力。要想避免卡死、内存溢出、进度条永远停在 0%,你必须手动将表分批处理,或者利用前缀过滤来控制扫描范围。 为什么 Mac 上点击「结构同步」后界面会卡住

MySQL中UNION操作推荐用UNION ALL的原因
数据库 · 2026-07-03

MySQL中UNION操作推荐用UNION ALL的原因

MySQL中UNION与UNION ALL性能对比:别再被“保险”迷惑,差距远超预期 先给出核心结论:UNION ALL 的性能通常比 UNION 高出不止一个数量级。原因在于,UNION 在合并结果集后会自动触发去重操作,这往往伴随着隐式排序,进而产生临时表和文件排序。而 UNION ALL 则直