账号管理实操问答是什么
账号管理的问题集中在几类:这个账号到底能做什么、怎么只给一张表读写、怎么批量清理测试账号、账号被锁怎么自救、怎么确认某次连接的权限来源。这些问题都能用固定几条 SQL 回答,把它们固化下来比临时翻文档快得多。核心前提是分清「授权语句」和「查询授权状态」两类操作,批量改动一律先出语句、人工复核、再执行。
基本信息
| 看授权 | SHOW GRANTS FOR '账号'@'主机' |
|---|---|
| 看账号清单 | SELECT user, host, account_locked FROM mysql.user |
| 单表授权 | GRANT SELECT, INSERT, UPDATE, DELETE ON 库.表 TO '账号'@'主机' |
| 删除账号 | DROP USER '账号'@'主机';8.0 起可用 IF EXISTS |
| 锁定状态 | ALTER USER ... ACCOUNT LOCK / ACCOUNT UNLOCK |
典型使用场景
- 权限审计:核对某账号实际持有权限,判断是否超出职责范围
- 最小权限收敛:把库级授权收敛到具体表,降低误操作影响面
- 环境清理:定期清掉测试遗留的宽主机名账号
- 故障自救:账号被安全策略锁定后先解锁,再定位失败来源
- 变更前评估:改权限前先导出当前授权状态,便于回滚
问答速查
问答速查
-- 1) 这个账号能做什么
SHOW GRANTS FOR 'app'@'10.0.%';
-- 2) 只给某张表读写,不给整库
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.orders TO 'o1'@'10.0.5.7';
-- 3) 批量清理测试账号:先生成语句,人工复核后再执行
SELECT CONCAT('DROP USER ''', user, '''@''', host, ''';') AS stmt
FROM mysql.user WHERE user LIKE 'test%' AND host = '%';
-- 4) 账号被锁与解锁
SELECT user, host, account_locked FROM mysql.user WHERE user = 'app';
ALTER USER 'app'@'%' ACCOUNT UNLOCK;
-- 5) 授权后回看结果,确认没有多授
SHOW GRANTS FOR 'o1'@'10.0.5.7';高频问题对照
| 问题 | 用哪条语句 | 注意 |
|---|---|---|
| 账号能做什么 | SHOW GRANTS FOR | 输出按层级分行,要逐行读 |
| 有哪些账号 | 查 mysql.user | 注意 user 与 host 组合才是唯一账号 |
| 怎么只给单表 | GRANT 到 库.表 | 库级权限会覆盖表级需求,别顺手给库 |
| 怎么批量清理 | 先 SELECT 生成 DROP | 必须先复核再执行 |
| 账号为什么连不上 | 看 account_locked 与密码过期状态 | 锁定与过期是两码事 |
SHOW GRANTS 的输出按「全局 → 库 → 表 → 列」层级分行,看权限不能只看第一行:只读全局权限配一个库级写权限,合计就是「全库只读 + 指定库可写」。
8.0 用 CREATE USER 创建账号,隐式建账号的 GRANT 语法已被移除。清理账号时用 DROP USER,不要直接删 mysql.user 表里的行,后者会留下授权表残渣。