当需要定期修改密码,又不想影响现有连接的情况下,怎么才能做到无缝切换呢
添加新密码
ALTER USER 'appuser1'@'host1.example.com' IDENTIFIED BY 'password_b' RETAIN CURRENT PASSWORD;
废弃旧密码
ALTER USER 'appuser1'@'host1.example.com' DISCARD OLD PASSWORD;
官网介绍
从 MySQL 8.0.14 开始,用户帐户允许拥有双重密码,指定为主密码和辅助密码。双密码功能使得在以下场景中无缝执行凭证更改成为可能:
- 一个系统有大量MySQL服务器,可能涉及到复制。
- 多个应用程序连接到不同的 MySQL 服务器。
- 必须定期对应用程序用于连接服务器的一个或多个帐户进行凭据更改。
考虑在上述类型的场景中,当一个帐户只允许使用一个密码时,必须如何执行凭据更改。在这种情况下,必须在何时进行帐户密码更改并在所有服务器中传播以及何时将所有使用该帐户的应用程序更新为使用新密码的时间进行密切合作。此过程可能会涉及服务器或应用程序不可用的停机时间。
使用双密码,可以更轻松地分阶段进行凭证更改,无需密切合作,也无需停机:
- 对于每个受影响的帐户,在服务器上建立新的主密码,保留当前密码作为辅助密码。这使服务器能够识别每个帐户的主密码或辅助密码,而应用程序可以继续使用与以前相同的密码(现在是辅助密码)连接到服务器。
- 密码更改传播到所有服务器后,修改使用任何受影响帐户以使用帐户主密码进行连接的应用程序。
- 当所有应用程序从辅助密码迁移到主密码后,不再需要辅助密码,可以将其丢弃。此更改传播到所有服务器后,只能使用每个帐户的主密码进行连接。凭证更改现已完成。
MySQL 通过保存和丢弃辅助密码的语法实现双密码功能:
- 当您分配新的主密码时, and 语句
RETAIN CURRENT PASSWORD
的子句 会将帐户当前密码保存为其辅助密码。ALTER USER
SET PASSWORD
DISCARD OLD PASSWORD
for 子句 丢弃ALTER USER
帐户辅助密码,仅保留主密码。
假设,对于前面描述的凭据更改场景, 'appuser1'@'host1.example.com'
应用程序使用名为 的帐户连接到服务器,并且帐户密码将从 更改 为 。 '*
password_a*'``'*
password_b*'
要执行此凭据更改,请使用ALTER USER
以下命令:
-
在不是副本的每台服务器上,建立 新的主密码,保留当前密码作为辅助密码:
'*
password_b*'``appuser1
ALTER USER 'appuser1'@'host1.example.com'
IDENTIFIED BY 'password_b'
RETAIN CURRENT PASSWORD;
-
等待密码更改在整个系统中复制到所有副本。
-
修改使用该帐户的每个应用程序 ,以便它使用密码而 不是 来
appuser1
连接到服务器 。'*
password_b*'``'*
password_a*'
-
此时,不再需要二级密码。在每台不是副本的服务器上,丢弃辅助密码:
ALTER USER 'appuser1'@'host1.example.com'
DISCARD OLD PASSWORD;
-
将丢弃密码更改复制到所有副本后,凭证更改即完成。
和RETAIN CURRENT PASSWORD
子句 DISCARD OLD PASSWORD
具有以下作用:
RETAIN CURRENT PASSWORD
保留帐户当前密码作为其辅助密码,替换任何现有的辅助密码。新密码将成为主密码,但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。ALTER USER
(例外:如果or语句指定的新密码SET PASSWORD
为空,则即使RETAIN CURRENT PASSWORD
给出了辅助密码,辅助密码也将变为空。)- 如果您指定
RETAIN CURRENT PASSWORD
的帐户的主密码为空,则该语句将失败。 - 如果帐户有辅助密码,并且您更改其主密码而不指定
RETAIN CURRENT PASSWORD
,则辅助密码保持不变。 - 对于
ALTER USER
,如果您更改分配给该帐户的身份验证插件,则辅助密码将被丢弃。如果您更改身份验证插件并指定RETAIN CURRENT PASSWORD
,则该语句将失败。 - 对于
ALTER USER
,DISCARD OLD PASSWORD
丢弃辅助密码(如果存在)。该帐户仅保留其主密码,客户端只能使用该帐户通过主密码连接到服务器。
修改辅助密码的语句需要以下权限:
- 需要有权限
APPLICATION_PASSWORD_ADMIN
才能将RETAIN CURRENT PASSWORD
orDISCARD OLD PASSWORD
子句用于适用于您自己的帐户的ALTER USER
和语句。SET PASSWORD
操作您自己的二级密码需要该权限,因为大多数用户只需要一个密码。 - 如果要允许某个帐户操纵所有帐户的辅助密码,则应授予该帐户该
CREATE USER
权限而不是APPLICATION_PASSWORD_ADMIN
.
作者公众号