mysqldump 默认不导出函数和触发器,因二者属程序性逻辑对象,需显式启用--routines(导出存储过程/函数)和--triggers(导出触发器)开关;二者互不包含、不自动激活,权限不足时静默跳过,且DEFINER可能引发跨环境导入失败。

必须用 mysqldump 加 --routines 和 --triggers,缺一不可;否则导出文件里根本不会出现 CREATE FUNCTION 或 CREATE TRIGGER 语句。
为什么 mysqldump 默认不导出函数和触发器
MySQL 的 mysqldump 默认只导出表结构和数据。存储过程、函数、事件、触发器这些都属于“routines”或“附属对象”,需要显式启用开关——--routines 负责函数和存储过程,--triggers 是独立参数,专管触发器。这两个参数互不包含,也不受 --no-data 或 --all-databases 自动激活。
- 没加
--routines:dump 文件里搜不到CREATE FUNCTION或CREATE PROCEDURE - 没加
--triggers:哪怕加了--routines,CREATE TRIGGER依然不会出现 - 权限不足时会静默跳过(尤其在 RDS 上):报错
Access denied; you need (at least one of) the SUPER or BACKUP_ADMIN privilege(s),但 dump 文件仍生成,内容却缺失
快速导出函数 + 触发器的最小可行命令
只导定义、不导表结构和数据,最干净的组合是:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
mysqldump -u user -p --no-data --no-create-info --routines --triggers your_db_name > routines_and_triggers.sql
-
--no-data:跳过所有INSERT语句 -
--no-create-info:跳过CREATE TABLE,但保留CREATE FUNCTION/CREATE TRIGGER - 务必指定数据库名(不能只写
--all-databases,否则部分版本会漏掉触发器) - 如果只想导某个库的函数/触发器,但不确定有没有权限,可先试跑:
mysqldump -u user -p --routines --triggers --no-data --skip-triggers your_db_name | head -20,看是否含DELIMITER或CREATE FUNCTION
导出后验证是否真的成功
别只看命令有没有报错,直接检查输出文件内容:
- 搜索
CREATE FUNCTION:至少应有 1 行匹配(哪怕函数为空) - 搜索
CREATE TRIGGER:数量应与SELECT COUNT(*) FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_db_name';一致 - 留意
DEFINER=`user`@`host`:跨环境部署前得用sed -i 's/DEFINER=`[^`]*`@`[^`]*`//g' routines_and_triggers.sql清除,否则导入可能失败 - 如果文件里只有
DELIMITER和空行,大概率是权限问题或 MySQL 版本低于 5.0.11(--triggers从该版本起才支持)
真正容易被忽略的是权限和 DEFINER。RDS 用户常卡在这两点:申请不到 SUPER,又忘了替换 DEFINER,结果 dump 出来能看、导入却报错。

















