最常见原因是误选“仅结构”导出模式,导致.psc文件仅有CREATE TABLE语句而无INSERT INTO;此外max_allowed_packet过小、权限不足、还原未勾选“删除或截断”也会造成数据缺失。
导出时误选“仅结构”模式
这是最常见原因:navicat 生成的 .psc 文件里只有 create table,没有 insert into。界面看起来表都存在,但双击打开就是空的。
验证方法很简单:.psc 文件本质是 ZIP 压缩包,把后缀改成 .zip,用解压工具打开,进 data/ 目录,找对应表名的 .sql 文件(如 users.sql),打开看有没有 INSERT INTO `users` VALUES 这类语句。
- 导出向导中必须勾选「数据和结构」,不是「仅结构」或「仅数据」
- 如果用了「仅数据」,则不会建表,还原时目标库若无表会失败;若已有空表,则导入后仍为空
- 「仅结构」导出的
.psc在 Navicat 里能正常加载表结构,但数据完全缺失——它没做错,只是按你选的模式执行了
max_allowed_packet 过小导致 INSERT 截断
即使选了「数据和结构」,大文本字段(如 TEXT、JSON)也可能触发 MySQL 的 max_allowed_packet 限制,导致部分或全部 INSERT 被静默丢弃,最终 .sql 文件里只有开头几条数据,甚至整张表为空。
现象是:.psc 解压后 data/users.sql 有 INSERT,但行数远少于实际记录数,且最后一条不完整。
- 检查当前值:
SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'; - 临时调高(需重启服务才对所有连接生效):
SET GLOBAL max_allowed_packet = 52428800;(即 50M) - 永久生效:在
my.cnf或my.ini的[mysqld]段下添加max_allowed_packet = 50M,然后重启 MySQL - 注意:Navicat 连接本身也受该参数约束,不只是服务端
还原时未启用“删除或截断”选项
目标库已存在同名表,但还原设置里没勾选「如果存在则删除表」或「截断表」,Navicat 就会跳过该表的数据导入——表结构不变,旧数据保留,新数据不写入,结果就是“看着像还原了,其实没动数据”。
- 还原对话框 → 「高级」→ 确保勾选「如果存在则删除表」或「截断表」(后者更安全,保留表结构)
- 若勾选了「跳过已存在的表」,那所有已有表都会被忽略,无论是否为空
- 这个选项默认常为关闭状态,容易被忽略
用户权限不足导致静默丢行
Navicat 导出依赖 SELECT 权限,但如果账号只有列级权限(比如 GRANT SELECT(id,name) ON db.tbl TO 'u'@'%'),而导出时默认执行 SELECT *,MySQL 会因无权访问某些字段,直接跳过整行——任务显示成功,但导出文件里一行数据都没有。
- 用该账号登录命令行,执行
SHOW GRANTS;,确认是否有完整表级SELECT - 临时换用
root或高权限账号重试导出,快速验证是否权限问题 - 若必须用受限账号,导出前在「高级」→「字段」里手动只勾选有权限的列,避开无权字段
- 注意:视图、生成列、JSON 字段等特殊字段更容易触发权限校验失败
真正难排查的是组合型问题:比如导出时选了「仅结构」+ 还原时又没删表 + 用户权限刚好够看表头但不够查数据——三者叠加会让整个流程看起来“一切正常”,结果却是空表。建议每次还原前,先解压 .psc 看 data/ 目录内容,比依赖 Navicat 界面反馈更可靠。











