临时用户必须显式创建且权限最小化,禁用自动创建、通配符授权和WITH GRANT OPTION,通过密码过期、资源限制及定时清理实现可控时效。
CREATE USER 显式创建,不能靠 GRANT 自动补全MySQL 8.0+ 默认关闭了 sql_mode 中的 NO_AUTO_CREATE_USER,但 GRANT 不再自动建用户。如果直接写 GRANT SELECT ON db.* TO 'tmpuser'@'localhost',会报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT。必须先创建用户,再赋权。
tmp_report_202505),避免重名或误复用%,优先指定具体 IP 或 localhost,降低暴露面validate_password 策略,否则 CREATE USER 直接失败WITH GRANT OPTION
临时用户只应拿到完成任务所需的最

SELECT,不给 INSERT/UPDATE/DELETE;调试 SQL 可能需要 EXECUTE(对存储过程),但绝不该有 CREATE ROUTINE 或 ALTER 权限。
GRANT ALL PRIVILEGES ON *.* —— 这是高危操作,且 MySQL 8.0+ 对 SYSTEM_VARIABLES_ADMIN 等动态权限也做了隔离WITH GRANT OPTION 会让用户能把权限转授他人,临时账号一律禁用GRANT,不要用 ON `db_%`.* 这类模糊匹配(MySQL 不支持通配符库名授权)password_expired 或 MAX_QUERIES_PER_HOUR 辅助管控MySQL 本身不提供“临时用户到期自动删除”机制,但可通过组合策略实现软性时效控制:
PASSWORD EXPIRE:CREATE USER 'tmp_app'@'192.168.1.%' IDENTIFIED BY 'xYz123!' PASSWORD EXPIRE;用户首次登录必须改密,适合一次*付场景
CREATE USER 'tmp_api'@'%' IDENTIFIED BY 'aBc456!' WITH MAX_QUERIES_PER_HOUR 1000;配合应用层监控,超量即失效
mysql.user 表中 User 匹配 tmp_% 的记录,再 DROP USER —— 注意 MySQL 8.0+ 必须带主机名,DROP USER 'tmp_test' 会报错DROP USER 是即时生效的,但不会杀掉已建立的连接。如果用户正在执行长查询或事务,连接仍存在,只是后续新请求会被拒绝。这容易造成应用报错(如 Access denied)却查不到原因。
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE USER LIKE 'tmp%';
KILL:KILL 12345;(ID 来自上一步)
DROP USER 'tmp_user'@'host' —— 主机名必须完全一致,大小写敏感mysql.role_edges、mysql.default_roles 等系统表一并清除,无需手动清理临时用户的核心不是“快”,而是“可控”。权限粒度、主机范围、密码策略、连接清理,每个环节漏掉一个,都可能把“临时”变成隐患。