1. 项目概述:为什么MySQL密码管理是运维基本功
在Linux服务器上,MySQL数据库几乎是所有Web应用、数据分析平台和后台服务的核心组件。作为运维或开发人员,我们每天都要和它打交道。而数据库安全的第一道防线,就是访问密码。无论是新环境初始化、同事离职交接、定期安全加固,还是自己不小心忘记了密码,修改MySQL用户密码都是一项必须熟练掌握的基础操作。
很多人觉得改密码不就是一条SET PASSWORD命令吗?但实际操作中,你会遇到各种场景:root密码忘了怎么办?命令行下怎么安全地输入新密码?如何批量修改多个用户的密码?不同版本的MySQL(比如5.7和8.0)命令有差异吗?这些问题,如果没有系统的梳理和实操经验,很容易踩坑,轻则浪费时间,重则可能导致数据库服务中断或安全风险。
今天,我就结合自己多年在运维一线的经验,为你彻底拆解Linux环境下修改MySQL密码的四种核心方式。这不仅仅是四条命令的罗列,我会深入每种方法背后的原理、适用场景、隐藏的细节以及我踩过的那些“坑”,让你在任何情况下都能从容应对。无论你是刚入行的新人,还是需要查漏补缺的老手,这篇内容都能给你带来直接的帮助。
2. 四种密码修改方式的核心思路与选型考量
面对修改密码这个需求,为什么会有多种方法?这背后其实是不同场景下的权限状态、可用工具和安全策略共同决定的。我们不能只会一种,必须根据手头的“牌”来出招。
2.1 场景化需求解析:你的起点决定了路径
在动手之前,你必须先明确自己处于哪种状态。这直接决定了你能采用哪种方法。
场景一:已知当前密码,进行常规修改或安全轮换。这是最理想、最安全的情况。你拥有某个数据库用户(比如root或一个应用账号)的当前有效密码,可以正常登录到MySQL命令行客户端。你的目标可能是执行公司安全策略要求的定期密码更换。此时,你拥有完整的SQL命令执行权限,所有在MySQL内部修改密码的SQL语句都可用。我们的**方式一(使用SET PASSWORD语句)和方式二(使用ALTER USER语句)**就是为此而生。它们是在线、联机操作,无需重启服务,对业务影响最小。
场景二:忘记了root密码,需要“救火”。这是最令人头疼但也很常见的场景。你可能接手了一台老服务器,文档不全;或者自己设置的复杂密码太久没用,忘记了。此时,你无法通过常规身份验证进入MySQL。解决办法就是让MySQL“跳过”权限验证表启动,这样你就能以无密码方式登录,然后重设密码。这就是**方式三(使用--skip-grant-tables模式)**的核心思路。这是一种“外科手术式”的修复方法,需要重启MySQL服务进程,并在一段时间内让数据库处于一个不验证密码的特殊状态,因此操作必须快、准、稳,并在完成后立即恢复安全状态。
场景三:需要在Shell脚本中自动化修改,或从外部管理。在自动化运维、CI/CD流水线或使用Ansible/Puppet等配置管理工具时,我们经常需要在非交互式环境下修改密码。你不能手动输入密码,需要一条能直接执行的命令。mysqladmin这个MySQL官方命令行管理工具就派上了用场,它可以直接在操作系统Shell层面完成密码修改,这就是方式四(使用mysqladmin工具)。它本质上是封装了SQL命令,但提供了更脚本友好的接口。
2.2 版本差异:MySQL 5.7 vs 8.0 的关键变化
这是很多老手都会忽略却至关重要的点。MySQL在5.7和8.0版本之间,对用户认证和密码管理进行了重大升级。
- MySQL 5.7及以前:默认使用
mysql_native_password插件,密码加密方式相对简单。修改密码的SQL语句也较多,SET PASSWORD和ALTER USER都能用。 - MySQL 8.0及以后:默认认证插件改为
caching_sha2_password。这个插件更安全,但一些老的客户端驱动可能不支持。更重要的是,在MySQL 8.0中,SET PASSWORD语句被标记为过时(Deprecated)。官方明确推荐使用ALTER USER语句来管理用户和密码。如果你在8.0的环境里还习惯性地用SET PASSWORD,可能会收到一个警告,虽然目前还能用,但指不定哪个小版本更新后就彻底移除了。
注意:如果你管理的生产环境是MySQL 8.0,请务必优先使用
ALTER USER语法。这不仅是为了兼容未来,其语法也更标准化、功能更强大(比如直接指定认证插件)。
2.3 安全第一:密码策略与操作红线
无论用哪种方式,安全原则必须贯穿始终。
- 密码复杂度:不要设置如
123456、root这样的弱密码。MySQL本身支持密码复杂度策略插件(如validate_password),建议启用。 - 命令行历史:在Shell中直接使用
-p参数后接明文密码(如-pMyPass123)是极度危险的!因为其他用户可以通过history命令看到你的完整命令,密码就泄露了。安全的做法是只用-p,然后回车,在提示符下输入密码(输入过程不可见)。 --skip-grant-tables模式的危险性:该方法会让任何用户无需密码即可连接数据库,拥有全部权限。操作期间,务必确保MySQL服务只监听在本地(127.0.0.1),并且操作过程要迅速,完成后立即重启到正常模式。绝对禁止在生产环境长时间保持此模式。- 权限最小化:不要动不动就用
root。为应用创建专属的、权限受限的数据库用户。修改这些用户的密码时,你同样可以用这些方法,只是需要先用root或其他有足够权限的用户登录。
3. 方式一详解:使用 SET PASSWORD 语句(经典但渐退)
这是最传统、最经典的修改密码方式,在MySQL 5.7及以前版本中被广泛使用。它的语法直观,直接对“密码”这个属性进行操作。
3.1 语法拆解与参数说明
基本语法如下:
SET PASSWORD [FOR user] = password_option;我们来拆解每个部分:
SET PASSWORD: 固定关键字,声明要执行设置密码的操作。[FOR user]: 可选部分。如果不指定FOR user,那么修改的就是当前登录用户自己的密码。如果指定,则是修改指定用户的密码,当然,当前登录的用户必须有修改其他用户密码的权限(通常是root或具有UPDATE权限的用户)。user的格式是'username'@'hostname'。例如'app_user'@'192.168.1.%'或'root'@'localhost'。主机名部分很重要,它决定了用户从哪个网络地址连接进来。'root'@'localhost'和'root'@'%'在MySQL看来是两个不同的用户账户。
= password_option: 这是设置密码的核心。在旧版本中,可以直接用PASSWORD('明文密码')函数,但这个函数在MySQL 5.7.6之后被移除了。现在标准且安全的做法是直接使用一个字符串字面量,或者用auth_plugin指定的哈希值。
最常用的标准写法是:
SET PASSWORD FOR 'username'@'hostname' = '明文新密码';或者,修改当前用户自己的密码:
SET PASSWORD = '明文新密码';MySQL服务端收到这个命令后,会根据当前默认的认证插件(如caching_sha2_password)自动对新密码进行哈希加密,然后将哈希值存储到mysql.user系统表中。你不需要,也不应该手动计算哈希值。
3.2 完整实操步骤演示
假设我们以root用户登录,需要将用户'reporter'@'%'的密码改为SecurePass2024!。
登录MySQL:
mysql -u root -p回车后,在提示符下输入
root用户的当前密码。执行修改命令:
SET PASSWORD FOR 'reporter'@'%' = 'SecurePass2024!';如果命令成功,你会看到提示:
Query OK, 0 rows affected (0.01 sec)立即验证(非常重要): 不要关闭当前
root会话。新开一个终端窗口,尝试用新密码登录:mysql -u reporter -pSecurePass2024!或者更安全地:
mysql -u reporter -p然后输入
SecurePass2024!。如果能成功登录,说明修改生效。
3.3 注意事项与避坑指南
- MySQL 8.0的过时警告:在MySQL 8.0中执行
SET PASSWORD,你会看到类似这样的警告:
使用Query OK, 0 rows affected, 1 warning (0.00 sec)SHOW WARNINGS;查看,会提示'SET PASSWORD' is deprecated and will be removed in a future release.。这意味着在未来版本中它可能失效。对于新项目或MySQL 8.0环境,请避免使用此方法,转向ALTER USER。 - 密码中的特殊字符:如果新密码包含单引号
'、反斜杠\等特殊字符,需要在SQL语句中进行转义,否则会导致语法错误。例如,密码为O'Reilly@123,需要写成:
这增加了复杂性,容易出错。这也是推荐使用SET PASSWORD FOR 'user'@'%' = 'O\'Reilly@123';ALTER USER的一个小原因,其语法处理起来更一致。 - 修改后权限刷新:
SET PASSWORD执行后,修改会立即生效,并自动刷新权限,无需再执行FLUSH PRIVILEGES;。这是一个常见的误解点,很多老教程会多此一举。
4. 方式二详解:使用 ALTER USER 语句(现代首选)
这是目前MySQL官方最推荐的方式,语法更加强大、标准,也是未来发展的方向。它不仅能修改密码,还能修改用户的认证插件、密码过期策略等属性。
4.1 语法深度解析与功能扩展
基础语法是修改密码的核心:
ALTER USER [IF EXISTS] user IDENTIFIED BY '明文新密码';ALTER USER: 声明要修改用户属性。[IF EXISTS]: 可选项。如果指定,当要修改的用户不存在时,语句会生成一个警告而非错误。这在自动化脚本中很有用,可以避免因用户不存在而导致脚本中断。user: 格式同样是'username'@'hostname'。IDENTIFIED BY: 关键字,指定通过后面的明文密码来进行身份验证。'明文新密码': 用户的新密码。
它的强大之处在于扩展语法:
ALTER USER 'username'@'hostname' IDENTIFIED WITH caching_sha2_password BY '明文新密码' PASSWORD EXPIRE INTERVAL 90 DAY FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1;这条命令一次性完成了:
- 将用户认证插件改为
caching_sha2_password。 - 设置新密码。
- 设置密码90天后过期。
- 设置账户锁定策略:连续3次登录失败后锁定1天。
4.2 分步骤实操:从基础到高级
场景1:修改当前登录用户自己的密码。
-- 使用root登录后,想修改root自己的密码 ALTER USER USER() IDENTIFIED BY 'MyNewRootPass456!';这里USER()是一个函数,返回当前登录的用户名和主机名,非常方便。
场景2:管理员修改其他用户的密码。
-- 修改用户 'webapp'@'localhost' 的密码 ALTER USER 'webapp'@'localhost' IDENTIFIED BY 'StrongAppPass789!';场景3:升级用户认证插件并修改密码(MySQL 8.0迁移常见操作)。有些从5.7升级到8.0的应用,连接可能会因为认证插件问题失败。可以这样修复:
ALTER USER 'legacy_app'@'%' IDENTIFIED WITH mysql_native_password BY 'NewPassForOldPlugin';这样就将该用户的认证插件改回了旧的mysql_native_password,同时设置了新密码。注意:这只是临时兼容方案,长远应推动应用客户端升级以支持新的caching_sha2_password插件。
4.3 实战经验与技巧分享
- 密码过期管理:在安全要求高的环境,可以强制用户首次登录修改密码:
用户首次用这个临时密码登录后,MySQL会强制要求立即修改密码。ALTER USER 'new_user'@'%' IDENTIFIED BY 'TemporaryPass123' PASSWORD EXPIRE; REPLACE子句的安全验证:ALTER USER还有一个非常安全的功能,就是在修改当前用户自身密码时,要求提供旧密码进行二次验证,防止在登录会话未退出的情况下被他人恶意修改。
如果-- 当前用户是 'john'@'%' ALTER USER USER() IDENTIFIED BY 'SuperNewPass' REPLACE 'CurrentOldPass';'CurrentOldPass'不对,修改会失败。这个功能在共享管理账号或跳板机场景下特别有用。- 修改主机权限:
ALTER USER不能直接修改user账户中的主机部分(即'username'@'hostname'中的hostname)。如果你想允许用户从另一个IP访问,正确的做法是创建一个新用户,或者使用RENAME USER语句(先确保新旧用户都存在且具有相同密码)。
5. 方式三详解:使用 --skip-grant-tables 模式(终极恢复)
这是忘记root密码时的“救命稻草”。其原理是让MySQL服务启动时不加载权限认证表(grant tables),从而允许任何用户无需密码进行连接并拥有所有权限。这是一个高风险操作,必须谨慎、快速。
5.1 原理与风险深度剖析
MySQL的权限信息存储在mysql数据库的几张核心表里(如user,db,tables_priv等)。正常启动时,服务会加载这些表来验证每一个连接请求。--skip-grant-tables这个启动参数告诉MySQL:“跳过这些权限表,别验证了”。
带来的后果是:
- 任何知道MySQL服务端口和地址的人,都可以无需密码连接。
- 连接上来的用户默认拥有所有数据库的最高权限(相当于
root)。 - 在此期间,任何权限管理语句(如
GRANT,REVOKE,SET PASSWORD,ALTER USER)都无法执行,因为权限系统被禁用了。
因此,整个操作必须在数据库服务器本地进行,并且要确保MySQL服务只绑定在127.0.0.1(本地回环地址),避免被网络上的其他机器扫描攻击。操作流程必须是:停止服务 -> 以特殊参数启动 -> 无密码登录修改密码 -> 停止服务 -> 以正常参数启动。
5.2 步步为营的完整恢复流程
假设我们在一台CentOS 7服务器上,使用systemd管理的MySQL 8.0,忘记了root@localhost的密码。
步骤1:停止MySQL服务。
sudo systemctl stop mysqld确保服务已经完全停止,可以用sudo systemctl status mysqld确认状态为inactive (dead)。
步骤2:以--skip-grant-tables和--skip-networking模式启动。--skip-networking参数至关重要,它禁止MySQL监听任何TCP/IP端口,只允许本地通过Unix Socket文件连接,这相当于又加了一把锁。
sudo mysqld_safe --skip-grant-tables --skip-networking &对于使用systemd的较新版本,更推荐创建一个临时的配置文件来启动:
# 创建一个临时配置文件 echo -e "[mysqld]\nskip-grant-tables\nskip-networking" | sudo tee /etc/my.cnf.d/temp_recovery.cnf # 正常启动服务,它会读取我们添加的配置 sudo systemctl start mysqld用sudo systemctl status mysqld查看是否启动成功。
步骤3:无密码登录MySQL。由于跳过了权限验证,现在可以直接登录:
mysql -u root注意,这里不需要-p参数。
步骤4:重设root密码。登录后,你会发现执行ALTER USER或SET PASSWORD可能会报错,提示权限表没加载。在MySQL 5.7.6以后和8.0中,需要先手动加载权限表,然后才能修改。
-- 刷新权限,让服务器知道我们要重新使用权限系统(但此时仍在特殊模式) FLUSH PRIVILEGES; -- 现在可以修改root密码了,注意用户要写完整 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongRootPassword123!';重要:在MySQL 8.0中,
root用户的认证插件默认是auth_socket或caching_sha2_password。如果使用auth_socket插件(通过Unix Socket进行操作系统用户认证),上面的密码修改可能不生效。保险起见,可以同时指定插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourNewStrongRootPassword123!';
步骤5:退出并重启MySQL服务到正常模式。
EXIT;# 停止服务 sudo systemctl stop mysqld # 删除或重命名临时配置文件 sudo rm /etc/my.cnf.d/temp_recovery.cnf # 正常启动服务 sudo systemctl start mysqld步骤6:使用新密码验证登录。
mysql -u root -p输入你刚设置的新密码YourNewStrongRootPassword123!,确认登录成功。
5.3 极端情况处理与安全强化
- 如果
FLUSH PRIVILEGES;后仍无法修改:在极老的版本或某些特殊状态下,可能需要直接更新mysql.user系统表。这是最后的手段,不推荐,因为手动更新容易出错且可能破坏数据一致性。
8.0的哈希计算非常复杂,强烈建议不要手动计算,优先使用-- MySQL 5.7以前,使用PASSWORD函数 UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES; -- MySQL 8.0,密码存储在authentication_string字段 UPDATE mysql.user SET authentication_string=CONCAT('*', UPPER(SHA1(UNHEX(SHA1('newpass'))))) WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;ALTER USER。 - 安全强化操作:密码恢复后,务必进行一次全面的安全检查:
- 检查
mysql.user表中是否还有匿名用户(User列为空字符串)或测试用户,如有则删除。 - 确认
root用户是否可以从任意主机('root'@'%')登录。生产环境应限制root仅能从localhost登录。 - 考虑启用审计日志,监控后续的登录行为。
- 检查
6. 方式四详解:使用 mysqladmin 工具(脚本利器)
mysqladmin是MySQL安装包自带的一个命令行管理工具,它可以在不交互式登录MySQL客户端的情况下执行一些管理任务,修改密码是它的核心功能之一。这在自动化脚本中极其有用。
6.1 工具定位与参数精讲
mysqladmin通过TCP/IP连接MySQL服务器,并发送相应的命令。修改密码的命令格式是:
mysqladmin -u [用户名] -p[原密码] password "[新密码]"参数解析:
-u: 指定要修改密码的MySQL用户名。-p: 这个参数后面紧跟着原密码,中间不能有空格。例如原密码是oldpass,就写-poldpass。这是一种不安全的写法,因为密码会出现在进程列表和Shell历史中。更安全的方式是只写-p,然后回车,在提示符下输入原密码(不可见)。password:mysqladmin的子命令,表示执行修改密码操作。"[新密码]":新的密码,用引号括起来,防止Shell解析特殊字符。
一个安全的交互式用法示例:
mysqladmin -u app_user -p password "NewAppPass2024!"执行后,会提示你输入app_user用户的当前密码,输入正确后,密码才会被修改为NewAppPass2024!。
6.2 自动化脚本中的应用实例
在Shell脚本或Ansible Playbook中,我们无法进行交互式输入。这时,有几种策略:
策略A:使用-p后接原密码(有一定风险,适用于受控环境)。
#!/bin/bash OLD_PASS="current_password" NEW_PASS="new_secure_password" mysqladmin -u target_user -p${OLD_PASS} password "${NEW_PASS}"风险:原密码${OLD_PASS}以明文形式出现在脚本和进程列表中。
策略B:使用配置文件(推荐)。MySQL客户端可以从~/.my.cnf配置文件中读取用户名和密码。我们可以临时创建这个文件。
#!/bin/bash NEW_PASS="new_secure_password" # 创建临时配置文件,包含原密码 cat > /tmp/my_temp.cnf << EOF [client] user=target_user password=current_password EOF # 使用--defaults-extra-file指定配置文件,执行修改 mysqladmin --defaults-extra-file=/tmp/my_temp.cnf password "${NEW_PASS}" # 立即删除临时配置文件 rm -f /tmp/my_temp.cnf这种方式相对更安全,因为密码存储在临时文件中,且文件权限可以严格控制(如chmod 600),命令执行后立即删除。
策略C:使用expect或sshpass进行自动化交互(复杂场景)。对于需要完全自动化的场景,可以使用expect脚本模拟输入:
#!/usr/bin/expect set old_pass "current_pass" set new_pass "new_pass" spawn mysqladmin -u target_user -p password $new_pass expect "Enter password:" send "$old_pass\r" expect eof6.3 局限性与适用边界
- 只能修改当前连接用户的密码:
mysqladmin password命令修改的是-u参数指定的那个用户的密码,并且你需要知道该用户的原密码。它无法像root一样修改其他任意用户的密码。它的本质是模拟了该用户登录并执行了SET PASSWORD语句。 - 版本兼容性:在MySQL 8.0中,如果用户使用
caching_sha2_password插件,且服务器启用了SSL,mysqladmin通过非SSL连接修改密码可能会失败。需要确保连接是加密的,或者使用--ssl-mode=REQUIRED参数。 - 错误处理:在脚本中,务必检查
mysqladmin命令的退出状态码($?),非0表示失败,需要记录日志并采取相应处理措施。if mysqladmin -u user -ppass password "newpass"; then echo "密码修改成功" else echo "密码修改失败,退出码: $?" >&2 exit 1 fi
7. 常见问题排查与实战技巧实录
即使掌握了方法,在实际操作中还是会遇到各种“诡异”的问题。下面是我总结的几个高频问题和解决思路。
7.1 问题一:修改密码后,应用仍然连接失败
现象:你用root账号在MySQL里成功修改了应用账号app_user的密码,但重启应用后,日志显示Access denied for user 'app_user'。
排查思路:
- 密码错误:这是最常见的原因。仔细核对密码,特别是大小写、特殊字符。最稳妥的验证方法是,在服务器上直接用修改后的密码尝试登录:
输入新密码,看能否成功。mysql -u app_user -p - 主机名不匹配:你修改的是
'app_user'@'192.168.1.100'的密码,但应用是从192.168.1.200连接的。在MySQL中,这是两个不同的用户。使用以下命令查看app_user的所有授权记录:
确认应用连接使用的主机名或IP是否在授权列表中。你可能需要修改的是SELECT User, Host FROM mysql.user WHERE User = 'app_user';'app_user'@'%'(任意主机)或对应具体IP的那个用户。 - 密码插件不兼容(MySQL 8.0常见):应用客户端可能太老,不支持MySQL 8.0默认的
caching_sha2_password插件。查看用户认证插件:
如果SELECT User, Host, plugin FROM mysql.user WHERE User = 'app_user';plugin是caching_sha2_password,而应用报错包含“caching_sha2_password”,就需要将插件改回mysql_native_password:ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 应用连接池缓存了旧密码:很多应用(如Java的HikariCP、DBCP)或框架(如Spring Boot)会缓存数据库连接。密码修改后,连接池里的旧连接并未更新。需要重启应用,让连接池重新建立连接。
7.2 问题二:使用 --skip-grant-tables 后,ALTER USER 报错
现象:在跳过权限表模式登录后,执行ALTER USER root@localhost IDENTIFIED BY 'newpass';,报错ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。
原因与解决:这个错误提示很明确,在--skip-grant-tables模式下,服务器禁用了权限管理系统,因此不能执行权限管理语句。你需要先让服务器重新加载权限表。
FLUSH PRIVILEGES;执行这条命令后,权限系统被部分激活(虽然仍处于无密码验证状态),此时再执行ALTER USER或SET PASSWORD命令就可以成功了。这是MySQL 5.7.6之后版本的安全改进。
7.3 问题三:mysqladmin 修改密码时报错 “Access denied”
现象:执行mysqladmin -u user -poldpass password "newpass",返回mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'user'@'localhost' (using password: YES)'。
排查:
- 原密码错误:确认
-p后面跟的原密码是否正确。可以先用这个密码手动登录mysql -u user -p验证一下。 - 用户不存在或主机限制:确认用户
'user'@'localhost'是否存在。用户可能只允许从127.0.0.1或者特定主机连接。localhost和127.0.0.1在MySQL的Socket连接和TCP连接中有时会被区别对待。可以尝试指定主机:mysqladmin -u user -h 127.0.0.1 -poldpass password "newpass" - Socket文件问题:如果MySQL配置了特定的Socket文件路径,而
mysqladmin找不到,也会连接失败。可以通过mysql_config --socket查找路径,或用-S参数指定:mysqladmin -u user -poldpass -S /var/lib/mysql/mysql.sock password "newpass"
7.4 一份速查表:方法选择与命令参考
| 场景 | 推荐方法 | 核心命令示例 | 关键注意事项 |
|---|---|---|---|
| 已知密码,常规修改 | ALTER USER(MySQL 5.7.6+) | ALTER USER 'user'@'host' IDENTIFIED BY 'new_pass'; | MySQL 8.0首选,功能最全。 |
| 已知密码,旧版本环境 | SET PASSWORD | SET PASSWORD FOR 'user'@'host' = 'new_pass'; | MySQL 8.0中已过时。 |
| 忘记root密码 | --skip-grant-tables模式 | 1. 停服务 2. 安全模式启动 3. FLUSH PRIVILEGES;4. ALTER USER ...5. 重启服务 | 高风险,操作需快,务必加--skip-networking。 |
| Shell脚本自动化 | mysqladmin+ 配置文件 | mysqladmin --defaults-extra-file=cnf.cnf password "new_pass" | 避免密码出现在命令行历史。检查退出状态码。 |
| 修改当前用户自身密码 | ALTER USER或SET PASSWORD | ALTER USER USER() IDENTIFIED BY 'new_pass'; | USER()函数获取当前用户信息。 |
| 强制下次登录改密码 | ALTER USER的PASSWORD EXPIRE | ALTER USER 'user'@'host' PASSWORD EXPIRE; | 用户下次登录时会收到修改密码提示。 |
最后,再分享一个我个人的小习惯:每次修改重要密码(尤其是root密码)后,除了立即用新密码登录验证,我还会顺手检查一下mysql.user表中相关用户的plugin、password_last_changed字段,确认修改已生效且符合预期。这条简单的检查命令能帮你避免很多后续的迷惑。
SELECT User, Host, plugin, password_last_changed FROM mysql.user WHERE User IN ('root', 'your_app_user');