MySQL安装后test库并非默认开放,常见权限泄露源于空用户(''@'localhost')在mysql.db表中被授予test及test_%的隐式权限,需直查系统表并执行REVOKE+DELETE+FLUSH PRIVILEGES彻底清理。

确认 test 数据库是否真被默认授权
MySQL 安装后并不会自动给任意用户授 test 库权限,但部分旧版本(如 5.7 默认配置)或运维脚本会残留 '%'@'%' 对 test 和 test\_% 的隐式访问——这不是“默认开放”,而是权限表里留了野卡规则。
先查真实授权来源:SELECT Host, Db, Select_priv, Insert_priv, Drop_priv FROM mysql.db WHERE Db IN ('test', 'test\_%') AND User = '';。若返回非空行,说明空用户(''@'localhost' 或 ''@'%')被授了权,这是最常见源头。
别只看 SHOW GRANTS FOR CURRENT_USER,它不显示空用户的隐式权限;必须直查 mysql.db 表。
用 REVOKE 精准回收 test 库所有显式权限
显式权限指通过 GRANT 明确授予的,比如 GRANT ALL ON test.* TO 'dev'@'192.168.%'。这类权限必须用完全匹配的作用域撤销:
- 若原始授权是
ON test.*,就执行REVOKE ALL PRIVILEGES ON test.* FROM 'dev'@'192.168.%'; - 若原始授权是
ON test.users,就得写REVOKE SELECT, INSERT ON test.users FROM 'dev'@'192.168.%'; - 若用户有
GRANT OPTION,必须额外执行REVOKE GRANT OPTION ON test.* FROM 'dev'@'192.168.%';
注意:REVOKE ALL PRIVILEGES ON *.* 不会动 test.* 上的权限,作用域不匹配即静默失败。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
清理空用户对 test 和 test\_% 的隐式授权
很多“测试库可删可写”问题根源在此:空用户(''@'localhost')在 mysql.db 表中被设为 Select_priv = 'Y',导致任何未显式创建的用户都能查 test 库。
执行以下三步清空:
REVOKE ALL PRIVILEGES ON test.* FROM ''@'localhost';-
REVOKE ALL PRIVILEGES ON `test_%`.* FROM ''@'localhost';(反引号防止转义错误) -
DELETE FROM mysql.db WHERE Db IN ('test', 'test\_%') AND User = '';(兜底删记录,避免残留)
之后必须执行 FLUSH PRIVILEGES;,因为这是直接改系统表,MySQL 不自动刷新。
验证是否真正回收干净
回收不是执行完就结束。两个关键盲区常被忽略:
- 已建立的连接仍缓存旧权限,用
SELECT USER(), CURRENT_USER();登录后查当前会话身份,再试DROP TABLE test.t;或SELECT COUNT(*) FROM test.t;确认报错(ERROR 1142或ERROR 1044) - 如果用户绑定了角色(如
test_role),而该角色仍有test库权限,SHOW GRANTS FOR 'user'@'host'会显示角色继承的权限,需同步REVOKE 'test_role' FROM 'user'@'host';
最后检查 mysql.db 表是否还有残留:SELECT Host, User, Db FROM mysql.db WHERE Db LIKE 'test%'; —— 理想结果应为空。

















