mysql 8.0+中‘mysql.infoschema’@‘localhost’报access denied,因其是仅限内部使用的只读虚拟账户,不支持外部登录或授权;误连、脚本硬编码、监控遍历用户表或host匹配异常(如localhost与127.0.0.1混淆)是主因,应改用业务账号连接,切勿手动创建、授权或修改该账户。

MySQL 里出现 Access denied for user 'mysql.infoschema'@'localhost',不是你配错了,而是这个账号本就不该被手动登录——它是个只读、仅限内部使用的系统账号,强行连接或授予权限反而会破坏一致性。
为什么 mysql.infoschema 账号会报 Access denied
这个用户是 MySQL 8.0+ 自动创建的内置账号,Host 固定为 localhost,plugin 是 caching_sha2_password 或 mysql_native_password,但它的 authentication_string 字段为空或不可用。MySQL 启动时会自动加载它用于内部元数据访问(比如 information_schema 表的初始化),但它不接受外部连接请求。
常见诱因包括:
- 误用
mysql -u mysql.infoschema -p尝试登录 - 脚本中硬编码了该用户名去连库
- 某些 ORM 或监控工具未适配 MySQL 8.0+ 的系统账号机制,尝试枚举所有
user表记录并发起连接 - 执行
SELECT * FROM mysql.user后看到这行,误以为它是可操作的普通账号
不能给 mysql.infoschema 授予任何权限
直接运行 GRANT SELECT ON *.* TO 'mysql.infoschema'@'localhost' 会失败,报错 ERROR 1045 (28000): Access denied 或 ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s)。这不是权限不够,而是 MySQL 明确禁止修改该账号的任何字段(包括 Host、authentication_string、password_expired)。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
你唯一能做的只有:
- 确认它没被意外删除:
SELECT User, Host FROM mysql.user WHERE User = 'mysql.infoschema'; - 如果真被删了(极罕见),重启 MySQL 服务即可自动重建 —— 不需要手动
CREATE USER - 不要试图
UPDATE mysql.user修改它的密码或插件,会导致启动异常
遇到这个错误,实际该检查什么
真正要排查的,从来不是 mysql.infoschema 本身,而是触发它报错的那个上下文:
- 你的应用连接串里是否写死了
user=mysql.infoschema?立刻改成业务账号(如root或app_user) - 是否在用
mysqldump或mysqlpump时加了--all-databases却没加--skip-lock-tables?某些旧版工具会尝试连mysql.infoschema导致中断,升级到 MySQL 8.0.33+ 可缓解 - 监控脚本是否在遍历
mysql.user后对每个账号调用mysql -u $user -h localhost -e "SELECT 1"?应过滤掉以mysql.开头的用户 - 查看错误日志:
tail -n 50 /var/log/mysql/error.log,确认报错前一行是不是你的某个自动化任务在尝试连接
修复后仍看到 Access denied,重点看 host 匹配
即使你没动 mysql.infoschema,也可能因 host 解析问题间接触发。例如:
- 客户端用
127.0.0.1连接,而mysql.infoschema的Host是localhost,Unix socket 和 TCP 的匹配逻辑不同 -
bind-address配置为127.0.0.1,但某些容器或代理把连接重写成localhost,导致权限表匹配失败 - 使用
mysql --protocol=TCP强制走网络协议时,MySQL 会忽略localhost用户行,转而查%或具体 IP 行 —— 而mysql.infoschema没有%行
最稳妥的做法:永远用明确的业务账号连接,彻底避开所有以 mysql. 开头的系统账号。它们的存在意义是支撑 information_schema 和 performance_schema 正常工作,不是给你登录用的。










