Navicat 16模型同步报Access Denied的根本原因是MySQL服务端拒绝元数据查询,因用户缺少information_schema的SELECT权限、host不匹配或MySQL 8.0+需SYSTEM_VARIABLES_ADMIN等特定权限,而非客户端问题。
Navicat 16 模型同步报 Access Denied 的根本原因
这不是 navicat 客户端的问题,而是它在后台执行元数据查询时被 mysql 服务端拒绝。模型同步(model sync)会大量读取 information_schema 中的 tables、columns、key_column_usage、views 等视图,只要其中任意一项查不到,就直接抛 access denied; you need (at least one of) the select privilege(s) on information_schema.*。
MySQL 5.7 和 8.0+ 授权方式差异极大
别直接套用老教程里的 GRANT SELECT ON information_schema.* —— 在 MySQL 8.0+ 上这条命令会被忽略或报错,因为官方禁止对 information_schema 显式授权(它是只读虚拟库)。你真正需要的是:确保用户有 SELECT 权限 + host 匹配 + (必要时)补充高阶权限。
- MySQL 5.7 及更早:可安全执行
GRANT SELECT ON information_schema.* TO 'your_user'@'%'; FLUSH PRIVILEGES; - MySQL 8.0+:优先检查
SHOW GRANTS FOR 'your_user'@'%';是否已含SELECT权限;若仍失败,需追加SYSTEM_VARIABLES_ADMIN(比SUPER更精准)或确认 host 是'your_user'@'192.168.1.%'而非宽泛的'%'(云数据库常限制通配符 host) - 阿里云 RDS、腾讯云 CDB 等托管服务:
information_schema查询权限通常由控制台开关控制,需在“账号管理”页勾选“允许查看系统库”或提交工单开通
为什么明明有业务库权限却还是失败?
因为 MySQL 的权限是按 user@host 组合隔离的。'app_user'@'localhost' 和 'app_user'@'127.0.0.1' 是两个完全不同的账号,而 Navicat 默认用 TCP 连接(即走 127.0.0.1),哪怕你在本地运行,也不会触发 Unix socket 的 localhost 路径。
- 执行
SELECT user, host FROM mysql.user WHERE user = 'your_user';,确认返回结果里包含你实际连接时用的 host(比如'your_user'@'127.0.0.1') - 若只有
'your_user'@'localhost',补一条:GRANT SELECT ON information_schema.* TO 'your_user'@'127.0.0.1'; FLUSH PRIVILEGES;(5.7)或改用SYSTEM_VARIABLES_ADMIN(8.0+) - Navicat 连接设置里把
Host从localhost改成127.0.0.1,可强制统一路径,避免 host 不匹配
模型同步卡在“正在加载表结构…”后的隐蔽陷阱
这个现象往往不是权限缺失,而是 Navicat 尝试读取 information_schema.STATISTICS 或 information_schema.PARTITIONS 时被阻断 —— 这些视图依赖底层存储引擎状态,某些云厂商或 Docker 镜像默认禁用分区表支持或统计信息收集。
- 先验证基础元数据是否可达:
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db';,如果这句都报 Access Denied,说明权限没生效 - 如果上句成功但模型同步仍卡住,执行
SELECT COUNT(*) FROM information_schema.STATISTICS LIMIT 1;,失败则表明缺失统计信息访问权(部分环境需SELECT+PROCESS权限) -
PROCESS权限常被忽略:它不用于查业务数据,而是让 Navicat 能获取当前连接列表和事务状态,模型同步中用于判断锁表风险。补授:GRANT PROCESS ON *.* TO 'your_user'@'%'; FLUSH PRIVILEGES;
最容易被跳过的其实是 host 匹配和 MySQL 版本适配——同一套授权语句在 5.7 能跑,在 8.0+ 就静默失效;而你以为连的是 localhost,Navicat 实际发的是 127.0.0.1 请求。这两点不验清楚,反复授权也没用。


















