phpEnv中MySQL只读提示源于底层实例的read_only或super_read_only为ON,需进入MySQL执行SELECT @@global.read_only, @@global.super_read_only确认;若为1,须检查配置文件、权限、磁盘空间并执行SET GLOBAL read_only=OFF(配合super_read_only=OFF),而非仅依赖phpEnv界面重启。

phpEnv 是本地开发环境套件,它封装了 MySQL 服务,但其“只读模式”提示不是 phpEnv 自身的开关,而是底层 MySQL 实例的 read_only 或 super_read_only 被设为 ON 导致的。直接在 phpEnv 界面点“重启 MySQL”通常无效——你得进 MySQL 实例里关掉它。
确认当前 MySQL 是否真处于只读状态
别信界面提示,先连进去查真实值:
- 打开终端,用 phpEnv 提供的 MySQL 客户端或命令行执行:
mysql -uroot -proot(默认账号密码多为 root/root) - 运行:
SELECT @@global.read_only, @@global.super_read_only; - 若返回
1,说明写入被系统变量拦截;若都是0,问题在别处(比如用户权限、磁盘满、从库 SQL 线程卡死)
SET GLOBAL read_only = OFF 不生效?检查权限和版本
常见现象:你用 root 执行 SET GLOBAL read_only = OFF 后再查还是 1。原因有三:
-
read_only=1是配置文件写死的:检查 phpEnv 的 MySQL 配置路径(通常是phpenv\mysql\my.ini或phpenv\mysql\conf\my.cnf),确认[mysqld]段下没有read_only=1或super_read_only=1;删掉或注释后必须重启 MySQL 进程(不是 phpEnv 界面“重启服务”,而是任务管理器杀掉mysqld.exe再启) - MySQL 版本低于 5.7.8:
super_read_only不可用,但若配置中误写了它,MySQL 启动会忽略该行,read_only却仍生效;优先查read_only - 你不是 SUPER 用户:phpEnv 的 root 账号可能被手动回收过 SUPER 权限,运行
SELECT super_priv FROM mysql.user WHERE user='root';确认值为Y;否则需用更高权限账号修复,或重装 phpEnv
写操作仍被拒绝?大概率是用户权限问题,不是只读开关
phpEnv 默认建的 root 账号通常没问题,但如果你改过账号、或 PHP 应用用了其他数据库用户,就容易踩坑:
立即学习“PHP免费学习笔记(深入)”;
- PHP 连接时用的账号(比如
'app'@'localhost')可能只被授予了SELECT,没给INSERT/UPDATE——这和 MySQL 实例是否只读无关,是权限粒度问题 - 执行
SHOW GRANTS FOR 'app'@'localhost';,确认输出里包含GRANT SELECT, INSERT, UPDATE, DELETE ON `dbname`.*等,而不是只有SELECT - 如果用的是通配符授权(如
GRANT SELECT ON *.*),注意它不包含mysql系统库以外的写权限,且生产环境严禁这么干;本地开发可临时改为GRANT ALL PRIVILEGES ON `mydb`.* TO 'app'@'localhost';,再FLUSH PRIVILEGES;
磁盘满导致自动只读,常被忽略
MySQL 在数据目录所在分区使用率达 95%+ 时,会自动触发只读保护(尤其 Windows 下 NTFS 日志满或 Linux /var 满),此时 read_only 值仍是 0,但所有写操作报错 ERROR 1290 (HY000) 或 ERROR 1030 (HY000): Got error 28 from storage engine(错误 28 = No space left on device):
- 查磁盘:Windows 下看 phpEnv 数据目录(默认类似
C:\phpEnv\mysql\data)所在盘剩余空间;Linux/macOS 查df -h - 清日志:删除
mysql\data\*.err、mysql\data\*.log(确保 MySQL 已停);或进 MySQL 执行RESET MASTER;(仅限本地开发,勿在生产用) - 删临时文件:
mysql\data\ibtmp1(InnoDB 临时表空间)可删,重启 MySQL 后自动生成
真正麻烦的不是开关本身,而是 phpEnv 把 MySQL 进程、配置、数据目录全打包隐藏了——你得一层层剥开找源头。最省事的做法:备份好 mysql\data,卸载重装 phpEnv,它自带的 MySQL 默认就是可写的。但如果你已改过大量配置或数据,就得按上面顺序逐项排查,尤其别跳过磁盘空间检查。



















