navicat 17 不支持直接还原备份文件中的单张表,因其「还原备份」对话框仅提供数据库级或对象类型(如表、视图)大类勾选,无法展开至具体表名;可行方案是右键备份文件选择「提取sql」生成纯文本sql,再用编辑器精准截取目标表的create table和insert语句,手动执行恢复。

Navicat 17 的「还原备份」不支持单表粒度选择
直接点开备份文件右键「还原备份」,弹出的对话框里只有「数据库级」或「全部对象」勾选,SELECT * FROM information_schema.TABLES 那种按表名筛选的交互根本不存在。所谓“选择对象”选项卡,实际只允许你勾选「表」「视图」「存储过程」等大类,无法展开到具体某张表(比如 t_user)——这是 Navicat 自身设计限制,不是你操作错了。
真正可行的路径:用「提取SQL」+ 手动裁剪
Navicat 17 提供了隐藏但关键的功能:提取SQL。它能把 .nb3 备份文件反解成纯文本 SQL,之后你就能用文本工具精准切出目标表的建表和数据语句。
- 右键备份文件 → 选择「提取SQL」→ 指定保存路径,生成一个
backup_extracted.sql - 用 VS Code 或 Notepad++ 打开该文件,搜索
CREATE TABLE `t_user`(注意反引号,MySQL 默认带) - 从
CREATE TABLE开始,向下找到下一个CREATE TABLE或--注释行为止,把中间所有内容(含INSERT INTO `t_user`)复制出来 - 新建 SQL 文件,粘贴这段,顶部加
USE your_database;,保存为t_user_restore.sql - 在 Navicat 中右键目标数据库 → 「运行SQL文件」→ 选中该文件
为什么不能直接「还原备份」再删其他表?
因为「还原备份」默认是全量覆盖模式:它会先 DROP 现有同名表,再重建。如果你只想要 t_user,但备份里还有 t_order、t_product,那它们也会被强行重建——可能覆盖你线上已有的新数据,或触发外键冲突报错 ERROR 1217 (HY000): Cannot delete or update a parent row。
更麻烦的是,Navicat 不提供「跳过已存在表」或「仅插入不存在记录」的开关,高级选项里的「忽略错误」只对语法级错误有效,对主键冲突、重复插入完全无效。
绕不开的兼容性细节
提取出的 SQL 默认含 SET FOREIGN_KEY_CHECKS=0; 和 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';,这些在多数 MySQL 5.7+/8.0 环境下安全,但如果你连的是 MariaDB 或旧版 Percona,可能遇到 Unknown system variable 'SQL_MODE'。此时得手动删掉这行,或替换成 SET sql_mode=''。
另外,INSERT 语句默认用 INSERT INTO `t_user` VALUES (...) 格式,如果表字段顺序变了、或新增了非空无默认值列,执行会失败。最稳的做法是补全字段名:INSERT INTO `t_user` (id, name, created_at) VALUES (...)——这步必须人工核对原表结构。











