唯一可靠方式是仅授予SELECT权限且不勾选任何写权限;phpMyAdmin无表级只读开关,仅展示MySQL实际权限,config.inc.php配置无效,全局权限必须清空,仅在数据库级精确授权。
直接给用户只配 select 权限,其他写权限(insert、update、delete、drop、create 等)一律不勾选——这是唯一可靠、可审计、且 phpmyadmin 能正确识别并禁用操作按钮的方式。
为什么不能靠 phpMyAdmin 界面开关或 config.inc.php 配置?
phpMyAdmin 本身没有“表级只读”或“用户只读模式”的开关项。它不存储、不管理、也不干预 MySQL 的权限逻辑,只是读取 MySQL 的权限元数据,并据此灰掉按钮(比如“插入”不可点)或拦截请求。你在 config.inc.php 里改任何配置,都不会让一张表变成只读;改了也白改。
常见误操作包括:
- 在
$cfg['Servers'][$i]['auth_type']里乱设read_only字段——该字段根本不存在,PHP 会报错或静默忽略 - 以为勾选了“数据库特定权限”里的
SELECT就够了,却忘了取消全局权限中的ALL PRIVILEGES或GRANT OPTION——后者会让用户能自行授予权限,彻底绕过限制 - 用
root账号登录 phpMyAdmin 去测试,结果所有按钮都亮着——因为 root 有全部权限,跟你要配的只读账号完全无关
在 phpMyAdmin 中创建只读账号的实操步骤
以管理员身份(如 root)登录 phpMyAdmin,进入“用户账户”页操作:
- 点击“添加用户账户”,填用户名(如
ro_app)、主机(推荐localhost或具体应用服务器 IP,避免用%)、强密码 - 在“全局权限”区域:**全部不勾选**(尤其警惕
ALL PRIVILEGES、GRANT OPTION、SUPER) - 滚动到“数据库特定权限”,选择目标数据库(如
prod_db),再勾选仅需的SELECT;其他如INSERT、UPDATE、DELETE、CREATE、DROP等全部留空 - 点击“执行”——注意不是“保存”或“继续”,必须点“执行”才真正提交 SQL(背后执行的是
GRANT SELECT ON `prod_db`.* TO 'ro_app'@'localhost') - 用新账号重新登录 phpMyAdmin,确认只能展开数据库、查看表结构和数据,所有“插入”“编辑”“删除”按钮均为灰色
权限生效后仍能写入?检查这三个地方
如果新账号还能执行写操作,问题一定出在权限未真正隔离:
立即学习“PHP免费学习笔记(深入)”;
-
FLUSH PRIVILEGES没执行:MySQL 8.0+ 多数情况自动刷新,但旧版本或特殊部署下仍需手动执行;可在 phpMyAdmin 的“SQL”页运行该命令 - 账号主机名不匹配:比如你建的是
'ro_app'@'10.0.1.5',但应用连的是'ro_app'@'10.0.1.%',权限不命中;查SELECT User,Host FROM mysql.user WHERE User='ro_app'; - 用户被额外授予了更高权限:比如通过命令行或脚本执行过
GRANT ALL ON *.* TO 'ro_app'@'%'...,会覆盖数据库级限制;用SHOW GRANTS FOR 'ro_app'@'localhost';查看完整权限链
最易被忽略的一点:phpMyAdmin 的“用户账户”界面默认只显示“数据库特定权限”,但如果你在“全局权限”区域误勾了任何一项(哪怕只是 SHOW DATABASES),它就可能隐式携带更高上下文权限;务必清空全局权限栏,只在数据库级精确授权。



















