MySQL 提供密码过期功能,使数据库管理员可以要求用户重置密码。密码可以手动过期,并基于自动过期策略(请参阅 第 6.2.15 节,“密码管理”)。
该ALTER USER语句启用帐户密码过期。例如:
ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;
对于使用具有过期密码的帐户的每个连接,服务器要么断开客户端连接,要么将客户端限制为“沙箱模式”,在这种模式下,服务器只允许客户端执行重置过期密码所需的操作。服务器采取的操作取决于客户端和服务器的设置,稍后将讨论。
如果服务器与客户端断开连接,则返回 ER_MUST_CHANGE_PASSWORD_LOGIN 错误:
shell> mysql -u myuser -p
Password: ******
ERROR 1862 (HY000): Your password has expired. To log in you must
change it using a client that supports expired passwords.
如果服务器将客户端限制为沙盒模式,则在客户端会话中允许这些操作:
-
客户端可以使用
ALTER USER或 重置帐户密码SET PASSWORD。完成后,服务器恢复会话的正常访问,以及使用该帐户的后续连接。笔记
尽管可以通过将过期密码设置为其当前值来“重置”过期密码,但作为一个好的策略,最好选择不同的密码。DBA 可以通过建立适当的密码重用策略来强制不重用。请参阅 密码重用策略。
-
在 MySQL 8.0.27 之前,客户端可以使用该
SET语句。从 MySQL 8.0.27 开始,不再允许这样做。
对于会话中不允许的任何操作,服务器都会返回ER_MUST_CHANGE_PASSWORD 错误:
mysql> USE performance_schema;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.
mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.
这是mysql客户端的交互式调用通常会发生的情况, 因为默认情况下,此类调用处于沙箱模式。要恢复正常功能,请选择新密码。
对于mysql 客户端的非交互式调用(例如,在批处理模式下),如果密码过期,服务器通常会断开客户端连接。要允许非交互式mysql调用保持连接以便可以更改密码(使用沙箱模式中允许的语句),请将--connect-expired-password选项添加 到mysql命令。
如前所述,服务器是断开过期密码客户端的连接还是将其限制为沙盒模式取决于客户端和服务器设置的组合。以下讨论描述了相关设置以及它们如何交互。
笔记
此讨论仅适用于密码过期的帐户。如果客户端使用未过期的密码连接,服务器会正常处理客户端。
在客户端,给定的客户端指示它是否可以处理过期密码的沙箱模式。对于使用 C 客户端库的客户端,有两种方法可以做到这一点:
-
在连接之前 将
MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS标志传递mysql_options()给:bool arg = 1; mysql_options(mysql, MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, &arg);这是mysql 客户端中使用的技术,
MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS如果以交互方式调用或使用--connect-expired-password选项调用 ,则启用 该技术。 -
在连接时 将
CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS标志传递 给mysql_real_connect():MYSQL mysql; mysql_init(&mysql); if (!mysql_real_connect(&mysql, host, user, password, db, port, unix_socket, CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS)) { ... handle error ... }
其他 MySQL 连接器有自己的约定来指示是否准备好处理沙箱模式。请参阅您感兴趣的连接器的文档。
在服务器端,如果客户端表明它可以处理过期密码,服务器会将其置于沙箱模式。
如果客户端未表明它可以处理过期密码(或使用无法如此表明的旧版本客户端库),则服务器操作取决于disconnect_on_expired_password 系统变量的值 :
- 如果
disconnect_on_expired_password启用(默认值),服务器将与客户端断开连接并显示ER_MUST_CHANGE_PASSWORD_LOGIN错误。 - 如果
disconnect_on_expired_password禁用,服务器会将客户端置于沙箱模式。




