Navicat“转储SQL文件”不导出存储过程等对象是设计行为,因其仅针对表的DDL/DML,未扫描mysql.proc等元数据表;必须使用“数据传输”功能并显式勾选Functions/Procedures及启用“Export routines”高级选项才能完整导出可执行SQL。
navicat 默认的“转储 sql 文件”不导出存储过程、函数、视图、事件——这是设计行为,不是 bug。 你右键数据库选“转储sql文件→结构和数据”,出来的 .sql 文件里只有表和数据,create procedure、create view 等语句全都不见。必须换路径,用“数据传输”或“备份”功能才能覆盖这些对象。
为什么“转储 SQL 文件”不包含存储过程?
因为 Navicat 的 转储 SQL 文件 功能本质是针对表(TABLE)的 DDL + DML 导出,它不扫描 mysql.proc 或 information_schema.ROUTINES 表。即使你勾选了“包含对象”或“排除对象”,这个弹窗里根本就没有“存储过程”“函数”“事件”的复选框——那些选项只对表生效。
- 该功能底层调用的是
mysqldump --no-create-info --skip-triggers类似逻辑,不带--routines参数 - 视图虽属
TABLE类对象,但默认也不导出,除非显式启用“导出视图定义”(实际仍不可靠) - 勾选“排除/包含对象”仅影响表列表,对非表对象完全无感
正确导出存储过程:用“数据传输”并手动勾选 routines
这是最直接、可控的方式,支持 MySQL 5.7+ 和 8.x,导出内容完整可执行。
- 点击菜单栏
工具 → 数据传输 - 在
源区域选择连接、数据库;展开“对象类型”,务必勾选Functions和Procedures(视图、事件同理) - 在
目标区域选文件,设置保存路径和文件名,类型选.sql - 切到
高级选项卡 → 勾选Include CREATE PROCEDURE / FUNCTION statements(部分版本叫Export routines) - 点击
开始,生成的 SQL 文件开头会有DELIMITER $$和完整的CREATE PROCEDURE块
导出失败常见原因与绕过方法
即使按上述操作,也可能导出为空或报错,主要卡在权限或定义语法上:
- 用户账号缺少
SELECT权限访问mysql.proc或information_schema.ROUTINES→ 改用root或授予权限:GRANT SELECT ON mysql.proc TO 'user'@'%'; - 存储过程中含
DEFINER = 'xxx'@'yyy',且当前用户无 SUPER 权限 → 在高级选项卡中启用Remove DEFINER and SQL SECURITY - MySQL 8.0+ 默认禁用
log_bin_trust_function_creators→ 若导出后无法在目标库重建,需提前执行:SET GLOBAL log_bin_trust_function_creators = 1; - Navicat 版本太老(如 12.x 以下)可能不识别 8.0 的 routine 语法 → 升级到 Navicat 16 或 Premium 17+
备份方式提取 SQL 是备选,但有隐藏限制
通过 工具 → 备份 → 新建备份 → 只选 Functions/Procedures → 提取 SQL 也能拿到代码,但它不保证可重入:
- 提取出的 SQL 不含
DELIMITER,直接执行会因分号提前终止而报错ERROR 1064 - 不会自动处理
DEFINER,也不会补CREATE OR REPLACE,迁移时容易冲突 - 若原库有同名 routine 且未删,导入会提示
ERROR 1304: PROCEDURE already exists - 适合仅查看或人工编辑,不适合自动化部署
真正要让导出的 SQL 文件能一键在另一台 MySQL 上重建全部 routine,唯一可靠路径就是“数据传输”+ 显式勾选 + 启用 Export routines 高级选项。其他任何地方看到的“勾选包含对象”都只是对表起作用,别被界面误导。


















