MySQL不支持权限自动过期,仅能通过ACCOUNT EXPIRE(≥8.0.12)或PASSWORD EXPIRE AFTER N(≥8.0.11)控制账号新建连接,已存在长连接不受影响,须配合应用层或外部调度兜底。

MySQL 本身不支持“权限自动过期”,所谓“时效权限”只能靠账号生命周期控制实现——本质是让账号在指定时间后无法新建连接,已存在的长连接仍可操作,必须配合应用层或外部调度兜底。
确认 MySQL 版本是否支持 ACCOUNT EXPIRE(硬性截止日前提)
低于 8.0.12 的版本(包括所有 5.7)根本不识别 ACCOUNT EXPIRE,执行会直接报错 ERROR 1064 (42000),不是静默忽略。
- 先查版本:
SELECT VERSION();—— 返回值必须 ≥8.0.12 - 若返回
5.7.32或8.0.11,就别用ACCOUNT EXPIRE,改用PASSWORD EXPIRE AFTER N(仅限8.0.11+)或放弃原生方案 -
SHOW VARIABLES LIKE 'version%';和SELECT @@version;效果等同,选一个就行
用 ACCOUNT EXPIRE 设绝对到期日(适合明确截止场景)
它不依赖密码修改历史,只看系统日期是否超过设定值,适合“2026-12-31 前有效”这类硬性要求。
- 新建账号并设到期日:
CREATE USER 'ops_maint'@'10.20.%' IDENTIFIED BY 'm@int2026' ACCOUNT EXPIRE '2026-12-31'; - 修改已有账号:
ALTER USER 'ops_maint'@'10.20.%' ACCOUNT EXPIRE '2026-12-31'; - 立即过期(等效禁用):
ALTER USER 'ops_maint'@'10.20.%' ACCOUNT EXPIRE NOW; - 验证是否生效:
SELECT User, Host, account_locked, password_expired FROM mysql.user WHERE User = 'ops_maint';—— 过期后password_expired为Y,但account_locked仍为N
用 PASSWORD EXPIRE AFTER N 设相对有效期(兼容性稍好)
适用于“创建后 7 天内有效”这类场景,8.0.11+ 即可使用,但注意它和全局 default_password_lifetime 冲突。
- 必须显式关闭全局策略,否则可能被覆盖:
SET PERSIST default_password_lifetime = 0; - 建号时指定:
CREATE USER 'ops_maint'@'10.20.%' IDENTIFIED BY 'm@int2026' PASSWORD EXPIRE AFTER 7; - 该语法只认整数天,不能写成
AFTER '2026-12-31',会语法错误 - 第三方工具若不处理
ERROR 1820(绝大多数都不支持),那它连一次有效查询都完不成——别指望它能自己重置密码
权限授予与关键补位动作(容易被跳过的实操点)
临时账号不是“加权限”,而是新建一个独立用户实体。直接 GRANT 会失败,因为用户还不存在;而 GRANT USAGE ON *.* 等于只开了连接通道,后续所有操作都会被拒绝(ERROR 1044)。
- 先执行
CREATE USER,再执行GRANT SELECT, SHOW VIEW ON `prod_db`.* TO 'ops_maint'@'10.20.%';—— 明确限定库名,禁用通配符* - 显式执行
FLUSH PRIVILEGES;,避免跨版本或配置差异导致权限未加载 - 务必
REVOKE SHOW DATABASES ON *.* FROM 'ops_maint'@'10.20.%';,否则工具能列出所有库名,暴露架构 - 已建立的长连接不会中断——如果第三方工具维持连接池,过期后它还能继续执行语句,直到断开重连
真正要让权限“彻底失效”,得靠外部定时任务在到期时刻执行 REVOKE + FLUSH PRIVILEGES,MySQL 自身没有定时权限开关机制。


















