error 1449 表明 mysql 8.0 系统账户 mysql.infoschema@localhost 缺失,导致元数据查询(如 show databases)失败;需先确认并修复 mysql.user 表引擎为 innodb,再精确创建该用户、授予 information_schema 和 performance_schema 的 select 权限,最后执行 flush privileges。

ERROR 1449 报错说明
执行 SHOW DATABASES、SHOW TABLES 或访问 information_schema 时抛出 ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist,说明 MySQL 8.0 的内部系统视图定义者缺失。这不是普通用户权限问题,而是系统级账户损坏——mysql.infoschema 是 MySQL 8.0 引入的专用账户,用于安全代理访问 information_schema 和 performance_schema,一旦丢失,几乎所有元数据查询都会失败。
CREATE USER 失败:ERROR 1726 怎么办
直接运行 CREATE USER 'mysql.infoschema'@'localhost' 可能报错 ERROR 1726 (HY000): Storage engine 'MyISAM' does not support system tables。这是因为 MySQL 8.0 要求系统表(如 mysql.user)必须使用 InnoDB 引擎,而升级残留或误操作可能导致其仍为 MyISAM。
- 先检查引擎:
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='mysql' AND TABLE_NAME='user'; - 若返回
MyISAM,强制转为InnoDB:ALTER TABLE mysql.user ENGINE = InnoDB; - 同理检查并修复
db、tables_priv等权限表(错误提示里明确指出哪张表就改哪张) - 再执行
CREATE USER才可能成功
授权必须精确到 schema,不能只给 *.*
给 mysql.infoschema 授予 ALL PRIVILEGES ON *.* 是危险且无效的——该用户设计上只应有只读权限,且仅限系统库;授予全局权限反而可能触发后续认证失败或安全拦截。
- 正确授权语句是:
GRANT SELECT ON information_schema.* TO 'mysql.infoschema'@'localhost'; - 同样加授:
GRANT SELECT ON performance_schema.* TO 'mysql.infoschema'@'localhost'; - 不要用
@'%',MySQL 8.0 系统视图默认绑定@'localhost',host 不匹配照样报 1449 - 执行完必须
FLUSH PRIVILEGES;,否则权限不生效
INSERT INTO mysql.user 直接写入的注意事项
当 CREATE USER 持续失败(比如因插件限制),可退回到手动插入用户记录。但这一操作极易出错,关键点在于字段和值必须严格匹配 MySQL 8.0 的 mysql.user 表结构:
-
plugin字段必须设为mysql_native_password(尤其在旧应用或 Docker 环境中,caching_sha2_password可能导致连接中断) -
authentication_string不能为空,也不能填明文密码;可用占位符:'*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE' - 必须显式设置
Select_priv = 'Y',否则即使记录存在,权限校验仍失败 - 插入后务必两次
FLUSH PRIVILEGES;:一次加载记录,一次激活权限
这个账户本身不用于登录,只作视图定义者;它没密码、不接受外部连接,纯粹是权限链中一个“占位符角色”。漏掉任意一个字段或大小写错误,都会让整个元数据层瘫痪——这也是为什么很多人试了七八种方法才见效。











