首批通过分布式安全可靠测评,为关键业务系统打造
双密码管理
更新时间:2026-06-06 16:08:37
本文档介绍 MySQL 模式下双密码管理的配置方式、使用行为及相关示例。通过双密码管理功能,允许一个用户同时拥有两个有效密码,分别为主密码(Primary Password)和次密码(Secondary Password),主密码为当前生效的新密码,次密码为被保留的旧密码,两者可同时用于登录,称为双密码状态。该功能可应用于配置切换期间仍可使用旧口令连接,降低一次性全量改密带来的断连风险。
说明
本功能从 V4.4.2 BP1 版本开始支持。
语法
通过 ALTER USER 或 SET PASSWORD 语句可以修改用户密码并保留旧密码,进入双密码状态。
修改密码并保留当前密码
在设置新密码的同时保留原密码(新旧密码在一段时间内均可用于认证):
ALTER USER 'user_name'@'host'
IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;
user_name、host:与创建用户时的账户名规则一致(例如'appuser'@'%')。new_password:新密码明文(由服务端按插件策略存储)。
除 ALTER USER 外,SET PASSWORD 语句也可在赋值子句末尾加上 RETAIN CURRENT PASSWORD,效果与 ALTER USER ... IDENTIFIED BY ... RETAIN CURRENT PASSWORD 一致:
SET PASSWORD [FOR user] = PASSWORD('new_password') RETAIN CURRENT PASSWORD;
丢弃旧密码
在已完成新密码切换后,显式丢弃已保留的旧密码,仅保留当前密码:
ALTER USER 'user_name'@'host' DISCARD OLD PASSWORD;
执行成功后,旧密码不可再用于登录。
语法说明
- 除修改当前用户自身口令的场景外,执行
ALTER USER通常需要具备CREATE USER等相应管理权限;权限要求与通用ALTER USER一致。 ALTER USER场景下,RETAIN CURRENT PASSWORD仅在与IDENTIFIED BY同时指定时有意义;用于表达本次改密进入双密码状态。SET PASSWORD场景下则在=右侧密码选项之后追加该子句。DISCARD OLD PASSWORD用于在业务已全部切到新密码后,清理旧口令;若当前不存在有效旧密码,行为以报错提示为准。
示例
将用户 appuser 从任意主机连接的账户密码改为 NewPass,并保留改密前的旧密码:
obclient> ALTER USER 'appuser'@'%' IDENTIFIED BY 'NewPass' RETAIN CURRENT PASSWORD;
或使用 SET PASSWORD(效果等价):
obclient> SET PASSWORD FOR 'appuser'@'%' = PASSWORD('NewPass') RETAIN CURRENT PASSWORD;
确认业务已切换至新密码后,丢弃旧密码:
obclient> ALTER USER 'appuser'@'%' DISCARD OLD PASSWORD;
功能维护
双密码相关信息会反映在系统表/视图中,便于审计与维护:
- mysql.user 视图的
user_attributes列的additional_password键存放与旧密码相关的属性,用于双密码场景。 - oceanbase.DBA_OB_USERS 或 oceanbase.CDB_OB_USERS 视图的
OLD_PASSWORD、OLD_PASSWORD_START_TIME列用于双密码场景。