phpMyAdmin本身不提供真正创建MySQL用户的图形界面,仅通过Users标签页操作mysql.user表,且需当前账号具备CREATE USER和GRANT OPTION权限;共享主机常禁用该权限,故须用SQL窗口执行CREATE USER与GRANT语句并FLUSH PRIVILEGES生效。

phpMyAdmin 本身不管理用户权限,得用 MySQL 命令行或 SQL 窗口操作
phpMyAdmin 只是个图形界面,底层权限控制完全依赖 MySQL 的 GRANT 机制。你无法在 phpMyAdmin 的“用户账户”页面点几下就生成真正只读账号——那个页面只是展示和删改已有用户,新建用户时默认没授任何权限,必须手动执行授权语句。
常见错误是:在“用户账户 → 添加用户”填完用户名密码就以为完成了,结果登录后连 SELECT 都被拒绝,因为根本没给任何权限。
- 必须通过 phpMyAdmin 的“SQL”标签页(或命令行)执行
GRANT语句 - 新建用户后立即授权,不能跳过这步
- 避免用
GRANT ALL ON *.*,那是管理员权限,不是只读
只读权限的核心是 GRANT SELECT,但要注意作用域范围
只读 ≠ 全库只读。你要明确这个账号能查哪些库、哪些表。最常用的是限制到具体数据库,比如 myapp_db:
GRANT SELECT ON `myapp_db`.* TO 'readonly_user'@'localhost';
如果省略 FLUSH PRIVILEGES;,权限不会立刻生效;如果写成 GRANT SELECT ON *.*,就等于允许查所有数据库(包括 mysql 系统库),存在信息泄露风险。
立即学习“PHP免费学习笔记(深入)”;
- 表级限制:用
GRANT SELECT ON `db`.`table`控制单表 - 跨主机访问:把
'localhost'换成'%'或具体 IP,但需确认 MySQL 允许远程连接 - 别漏掉
SHOW VIEW—— 如果库中有视图,只给SELECT不够,查视图会报错
创建用户时用 CREATE USER 而不是 INSERT INTO mysql.user
直接往 mysql.user 表里插数据是危险操作,容易因哈希格式、字段缺失导致认证失败,而且 MySQL 8.0+ 默认用 caching_sha2_password 插件,手工插入密码几乎必错。
正确流程分两步(在 SQL 窗口执行):
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'strong_password';<br>GRANT SELECT ON `myapp_db`.* TO 'readonly_user'@'localhost';<br>FLUSH PRIVILEGES;
-
CREATE USER自动处理密码加密和基础字段初始化 - MySQL 5.7 和 8.0 的默认认证插件不同,
CREATE USER会适配,手写INSERT不会 - 执行完记得点 phpMyAdmin 右上角的“刷新”按钮,否则新用户可能不显示在用户列表里
测试只读是否生效:用新账号登录后尝试写操作
别只测 SELECT 成功就认为 OK。真实场景中,ORM、CMS 或前端调试可能隐式触发 INSERT、UPDATE、DROP,必须主动验证拒绝行为。
用新账号登录 phpMyAdmin 后,在 SQL 窗口执行:
INSERT INTO `myapp_db`.`users` (name) VALUES ('test'); -- 应报错 #1142 - INSERT command denied- 如果没报错,说明权限太宽(比如误授了
INSERT或用了GRANT ALL) - 如果连
SHOW TABLES都失败,可能是没授USAGE或数据库名拼错(注意反引号包裹) - phpMyAdmin 左侧数据库列表里,只读用户看不到没权限的库,这是正常表现,不是 bug
权限粒度比想象中细,比如 SELECT 不包含 LOCK TABLES,某些备份脚本会因此失败——如果你的只读账号要跑自动化任务,得额外确认是否需要补充极少数辅助权限。



















