ERROR 1146在phpEnv中主因是MySQL系统库(如performance_schema、mysql)缺失或损坏,常见于重装、升级未运行mysql_upgrade、手动清理data目录或lower_case_table_names配置不兼容;需停服后用mysqld --initialize-insecure重建系统表,并彻底终止残留mysqld进程。

phpEnv 环境下 MySQL 报 ERROR 1146,基本不是 phpEnv 自身问题,而是它内置的 MySQL 实例数据目录异常或初始化不完整 —— 最常见于重装、升级、手动清理 data 目录后,performance_schema 或 mysql 系统库关键表缺失。
为什么 phpEnv 启动后 Navicat / PHP 连接就报 1146?
phpEnv 默认使用轻量级 MySQL(如 5.7 或 8.0 社区版),其 data 目录通常位于 phpenv\mysql\data\。一旦你执行过以下任一操作,就极易触发 1146:
- 直接删除
phpenv\mysql\data\下的performance_schema或mysql文件夹 - 从旧版本 phpEnv 升级时,未运行
mysql_upgrade,或跳过了系统表更新步骤 - 用外部工具(如 mysqldump 全库导出)恢复时,漏掉了系统库(
--all-databases没加--skip-lock-tables导致mysql库没导全) - Windows 下修改过
my.ini的lower_case_table_names,但没重建 data 目录
典型表现:Navicat 连接成功但立即报 Table 'performance_schema.session_variables' doesn't exist;PHP 执行 mysqli_query($conn, "SHOW VARIABLES") 失败;SELECT * FROM mysql.user 直接 1146。
不重装 phpEnv,快速重建 system tables
核心思路:让 MySQL 重新初始化缺失的系统库表,而不是手动写 CREATE 语句(容易漏字段或引擎参数)。phpEnv 的 MySQL 可执行文件自带 mysql_system_tables.sql 和 mysql_system_tables_data.sql,只需正确调用。
立即学习“PHP免费学习笔记(深入)”;
- 先停掉 phpEnv 中的 MySQL 服务(通过托盘图标或命令:
phpenv service stop mysql) - 进入 phpEnv 安装路径下的 MySQL bin 目录,例如:
phpenv\mysql\bin\ - 执行初始化命令(以管理员权限运行 CMD/PowerShell):
mysqld --initialize-insecure --basedir=.. --datadir=..\data
(注意路径中的..指向 phpEnv 的 mysql 根目录) - 启动 MySQL:
mysqld --defaults-file=..\my.ini --console(观察控制台是否输出system tables updated) - 若启动失败且日志报
Table 'mysql.plugin' doesn't exist,说明lower_case_table_names配置与现有 data 不兼容 —— 此时必须删掉整个data目录,再执行上一步初始化
修复后仍报 1146 某个业务表?重点查这三处
如果系统库恢复了,但你的 PHP 项目连 myapp.users 还是报 1146,别急着重建库,先确认真实原因:
-
USE myapp;是否真的执行了?PHP 中常见错误是mysqli_select_db($conn, 'myapp')调用失败但被忽略,后续查询默认落在mysql库里 - 表名大小写:Windows 下 phpEnv 默认
lower_case_table_names=2,但若你建表用了大写(CREATE TABLE Users),又在 Linux 风格代码里写SELECT * FROM users,就会 1146 —— 查当前值:SELECT @@lower_case_table_names; - MyISAM 表的
.frm和.MYD文件是否都在phpenv\mysql\data\myapp\下?InnoDB 表则必须有.ibd+INNODB_SYS_TABLES字典记录,缺一不可
最易被忽略的一点:phpEnv 的 MySQL 服务常驻后台,即使你关了托盘图标,进程 mysqld.exe 可能仍在运行。修复前务必用 taskkill /f /im mysqld.exe 彻底杀净,否则新初始化的数据会被旧进程覆盖,白忙一场。



















