Navicat「转储SQL文件」功能不支持导出存储过程和函数,因其仅扫描TABLE类对象、不查询information_schema.ROUTINES表;必须使用「数据传输」或「备份」功能,并在右下角「高级」设置中勾选「导出存储过程和函数」,且账号需具备SELECT、SHOW VIEW、EXECUTE权限。
Navicat「转储SQL文件」根本不会导出存储过程和函数
右键数据库 →「转储sql文件」→ 选「结构…」或「结构和数据…」,生成的 .sql 文件里永远没有 create procedure 或 create function。这不是配置漏了,是这个功能压根不查 information_schema.routines 表——它只扫 table 类对象。哪怕你勾了「包含所有对象」,界面上也根本没「存储过程」「函数」这些复选框。
必须用「数据传输」或「备份」+ 高级选项才可能导出
两种路径都得手动进「高级」设置页(注意:不是「计划」里的那个按钮,是备份/数据传输对话框右下角的「高级」),且缺一不可:
- 勾选「导出存储过程和函数」——对应 MySQL 的
EXECUTE权限,没这权限导出来也是空的 - 确保源连接账号有
SELECT、SHOW VIEW、EXECUTE三权,少一个还原时就静默跳过 - 如果导出后文件里搜不到
DELIMITER $$,说明高级选项没生效,或连的是低权限账号——重做备份比调试更快
导出后还原失败?大概率卡在 MySQL 5.7+ 的安全限制上
即使 SQL 文件里有 CREATE FUNCTION,执行时也可能报 ERROR 1418 (HY000): This function has none of DETERMINISTIC。MySQL 5.7 起默认要求函数/过程声明特性(DETERMINISTIC、NO SQL 或 READS SQL DATA),否则拒绝创建。
- 临时方案:在导出 SQL 文件开头手动加一行
SET log_bin_trust_function_creators = 1; - 若还原到从库,先确认
sql_log_bin=ON,否则触发器和过程会静默不执行 - 别信 Navicat 弹窗“备份成功”——打开
.sql文件,直接搜索CREATE PROCEDURE确认内容真实存在
导出纯结构(不含数据)时容易忽略的权限细节
用「数据传输」导出结构时,取消勾选「创建记录」只是第一步。真正容易被绕过的点是:视图、事件、触发器、函数这些对象,必须在对象选择列表里单独勾选,它们不随「表」自动带出。
- 「数据传输」→「对象类型」展开后,要手动勾选
Functions、Procedures、Triggers、Events - 「转储SQL文件」→「结构…」→「结构」选项卡里也有对应复选框,但仅限该功能支持的对象;函数和过程不在其中
- 导出路径建议用纯英文无空格绝对路径,比如
D:\backup\schema_with_routines.sql,避免因路径解析异常导致部分对象丢失
CREATE FUNCTION 和 DELIMITER 块——这是唯一可信的证据。











