MySQL 8.0不支持原子密码切换,必须用ALTER USER ... IDENTIFIED BY ... RETAIN CURRENT PASSWORD启用双密码共存,再显式执行DISCARD OLD PASSWORD清理旧密码,全程需满足版本≥8.0.14、插件为caching_sha2_password且账户已有非空密码。

MySQL 8.0 的 CREATE USER 和 ALTER USER 不支持“原子切换”密码
直接执行 ALTER USER 'appuser'@'%' IDENTIFIED BY 'newpass' 会立刻切断所有使用旧密码的活跃连接,这不是轮转,是中断。真实业务中,应用连接池往往缓存凭证、重连逻辑不统一,强行改密极易触发批量认证失败或连接雪崩。
核心矛盾在于:MySQL 本身不提供双密码并存机制(如 Oracle 的 IDENTIFIED BY VALUES 多哈希支持),也没有类似 PostgreSQL 的 VALID UNTIL 时间窗口控制。
可行路径只有一条:利用 MySQL 8.0+ 的「多因素认证(MFA)」能力模拟双凭证状态,配合应用层灰度切换。
用 authentication_policy 配合两个认证插件实现“双密码共存”
MySQL 8.0.30+ 支持为同一账号配置多个认证方法,只要任一通过即登录成功。这相当于在服务端侧“软性支持”双密码。
- 先启用
caching_sha2_password插件(默认),并保留旧密码哈希:ALTER USER 'appuser'@'%' IDENTIFIED WITH caching_sha2_password BY 'oldpass' - 再追加第二个认证方法,使用
mysql_native_password(或同插件不同哈希)承载新密码:ALTER USER 'appuser'@'%' IDENTIFIED WITH caching_sha2_password AS '$A$...newhash...' REQUIRE NONE—— 注意这里不能直接用BY,必须用AS指定哈希值 - 但 MySQL 不允许对同一插件重复声明;稳妥做法是:新建一个临时账号
'appuser_v2'@'%',用新密码初始化,并赋予完全相同的权限;再通过代理层或 DNS 切流,逐步将流量导过去
真正无缝的关键不在 SQL,而在中间层:你得让应用认为“还是连同一个账号”,而实际连接请求被路由到不同账号或实例。
应用连接池必须支持运行时凭证热更新
哪怕数据库侧做了双账号,如果应用用的是 HikariCP、Druid 等连接池,且密码硬编码在配置文件里,重启才能生效,那就毫无意义。
- HikariCP 本身不支持运行时改密,但可通过
setPassword()+evictAllConnections()组合触发重建(需自定义管理类) - Druid 提供
resetConnectProperties(),可动态替换username/password,随后调用close()再init(),但注意这是全量重建,有短暂不可用窗口 - 更稳的方式是:连接池底层不改密,而是让每个新连接从外部凭证中心(如 HashiCorp Vault、AWS Secrets Manager)拉取最新密码,配合 TTL 缓存(比如 5 分钟),避免频繁调用
漏掉这点,所有数据库侧努力都会被连接池“冻结”在旧密码上。
轮转窗口期必须监控 Aborted_connects 和 Connection_errors_authentication
即使流程跑通,也会有边缘 case:客户端缓存了旧连接、DNS 生效延迟、防火墙策略未同步、SSL 证书绑定旧账号等。这些不会报“密码错误”,而是表现为连接超时或拒绝。
关键指标不是“是否成功”,而是异常连接突增:
- 查全局状态:
SHOW GLOBAL STATUS LIKE 'Aborted_connects',对比轮转前后 10 分钟增幅 - 看错误日志关键词:
Authentication plugin 'caching_sha2_password' reported error或Access denied for user后是否带 IP 和时间戳 - 用 Performance Schema 定位具体失败账号:
SELECT * FROM performance_schema.events_statements_summary_by_account_by_event_name WHERE COUNT_STAR > 0 AND EVENT_NAME LIKE '%authenticate%'
真正的无缝不是零失败,而是失败可识别、可归因、可回滚。一旦发现某类客户端(比如某版本 JDBC 驱动)集中失败,立刻切回旧凭证并单独适配——这才是生产环境该有的节奏。


















