MySQL只读用户需分两层授权:先在全局勾SELECT、SHOW DATABASES、LOCK TABLES,再在数据库特定权限中为目标库和information_schema单独授SELECT;创建后必须点击“重新载入权限”(等价FLUSH PRIVILEGES)才生效。

必须手动为具体数据库授 SELECT 权限,不能只勾“全局 SELECT”——否则用户登录后 SHOW DATABASES 为空、SELECT 报 #1142 错误。
创建用户时主机字段填错,连都连不上
只读用户不是建完就能用,第一步就得让连接通。常见错误包括:
-
phpMyAdmin 里填了
localhost,但 PHP 应用用127.0.0.1连——MySQL 视为两个不同主机,直接拒绝认证 - 生产环境误选
%,哪怕开了防火墙,也等于把数据库端口暴露在公网下 - 填了域名但服务端没关
skip_name_resolve,DNS 解析失败导致超时
推荐填法:localhost(Web 和 DB 同机)、192.168.1.100(固定运维 IP)、192.168.%.%(测试网段限制)。
权限必须分两层设:全局 + 数据库级
只读用户需要的权限不是“全选一个框”,而是两个地方都要操作:
- 在“全局权限”区域,只勾
SELECT、SHOW DATABASES、LOCK TABLES(备份时防写入) - 提交后回到用户列表,点该用户的“编辑权限” → 切到“数据库特定权限” → 下拉选目标库(如
analytics)→ 勾SELECT - 额外加一步:同样在“数据库特定权限”里选
information_schema→ 勾SELECT,否则 Laravel 等框架执行SHOW CREATE TABLE会报 #1227(缺 SUPER 权限)
不点“重新载入权限”,新用户永远登不上
phpMyAdmin 5.2 的权限变更不是实时生效的。即使页面显示“用户已添加”,MySQL 内部缓存仍旧。不刷新就会:
- 用新账号登录 phpMyAdmin,提示
#1045 - Access denied for user 'xxx'@'localhost' -
mysql -u xxx -p命令行也连不上
正确做法:创建并设好权限后,回到用户列表页,点击右上角那个循环箭头图标(重新载入权限),它等价于执行 FLUSH PRIVILEGES;。
最容易被忽略的是 information_schema 授权和 重新载入权限 这两步——前者影响框架行为,后者决定权限是否真生效,漏掉任一都会让“只读用户”变成“无法登录用户”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











