MySQL8.X 双密码机制:解决应用程序用户不停机修改密码问题
在数据库管理中,定期更新密码是确保系统安全的重要手段。然而,如何在不影响现有连接的情况下平滑地切换密码,避免系统停机,始终是一个挑战。MySQL 8.0 引入的“双密码”机制为这种需求提供了有效的解决方案,使得密码更新过程能够无缝进行。
MySQL8.0双密码特性
自 MySQL 8.0.14 版本起,MySQL 支持为每个用户账户设置两个密码:主密码(新密码)和辅助密码(旧密码)。这种双密码机制能够在一些复杂的系统中,特别是当涉及大量 MySQL 实例、复制、多个应用程序连接以及频繁的密码更新时,保持服务不中断,从而实现更流畅的密码更改流程。
下面是详细操作和解说:
/* * 检查账号情况 * 如果账户不存在或者当前密码为空 无法保留旧密码 * 确保目标账户的 authentication_string 非空, * 如果账户当前没有密码,执行 RETAIN CURRENT PASSWORD 会直接报错 ERROR 3031 */ -- 查询账号情况 SELECT * FROM mysql.user WHERE user='user'; /* * 该命令会将 new_password 设置为主密码,并将旧密码保留为辅助密码。 * 此时,无论是使用新密码还是旧密码的客户端,都能正常连接到数据库。 */ -- 设置新密码并保留旧密码 (RETAIN CURRENT PASSWORD) ALTER USER 'user'@'host' IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD; /* * 请在此阶段完成应用端配置更新与连接池刷新 * */ -- 下面查询可以检查账号连接进程 SELECT * FROM performance_schema.threads WHERE PROCESSLIST_USER='user'; /* * 该命令会丢弃辅助密码(原密码),使得数据库仅接受主密码(新密码) * 此时,客户端只能使用主密码进行连接,旧密码(辅助密码)将不再有效。 */ -- 彻底清理旧密码 (DISCARD OLD PASSWORD) ALTER USER 'user'@'host' DISCARD OLD PASSWORD;其他注意事项:
1.严格的前置校验:先检查mysql.user表,确保目标账户的authentication_string非空。如果账户当前没有密码,执行RETAIN CURRENT PASSWORD会直接报错ERROR 3031。
2.主从同步阻塞等待:双密码状态变更会通过 Binlog 同步到从库。如果主库执行完但部分从库尚未同步,连接从库的应用可能会随机遇到 Access denied。所以可以观察从库Seconds_Behind_Master = 0 就代表成功更新。
3.绝对禁止使用SET PASSWORD:全程使用ALTER USER。如果在外部运维系统中误用了SET PASSWORD FOR 'user'@'host' = 'new',它会直接覆盖主密码并清空辅助密码,导致旧连接瞬间失效。
4.不可逆的收尾操作:DISCARD OLD PASSWORD是不可逆的,一旦执行,旧密码彻底删除且无法回滚。
5.权限问题:执行该脚本的数据库用户需要具备ALTER USER权限,如果是非 root 用户,还需要拥有APPLICATION PASSWORD ADMIN动态权限。
总结:MySQL 8.0 的双密码机制为数据库管理员提供了一个无缝过渡的方式,使得密码更新过程可以分阶段进行,避免了传统方式中可能造成的停机和连接中断问题。通过这种机制,DBA可以在不影响系统可用性的前提下,安全地执行密码更新操作。