mysqldump 不支持按名称导出单个存储过程或触发器,仅提供全库级开关(-R/-E),需用 SHOW CREATE 或 sed 跨行提取;mysqlpump 可导出全部 routine 但不支持指定名称。

mysqldump 无法直接导出单个存储过程或触发器
不能用 mysqldump --routines 加个过滤参数就精准命中某几个过程——它只有全库/全表级开关,没有 --include-procedure=xxx 这类选项。你执行 mysqldump -R -E mydb,导出来的一定是该库下所有存储过程和所有触发器,没法按名筛选。
常见错误现象:以为加了 -R 就够了,结果还原时发现关键触发器没在 dump 文件里;或者误以为 grep "PROCEDURE myproc" 能安全提取,结果截断了多行定义体,source 时报语法错误。
-
mysqldump的--routines和--triggers是“全有或全无”,不支持对象粒度控制 - 托管环境(如阿里云 RDS、AWS RDS)常禁用
SUPER权限,导致mysqldump -R静默失败(文件生成但无过程定义) - 触发器必须随对应表一起导出才可靠;若用了
--no-create-info或只导库不指定表,部分 MySQL 5.6 版本会跳过触发器
用 SHOW CREATE 手动提取单个对象(最稳妥)
这是权限要求最低、版本兼容性最好、能精确控制输出内容的方式,适用于 MySQL 5.7+ 和 8.0+,且不依赖系统表读取权限。
注意两个硬性细节:
-
SHOW CREATE PROCEDURE mydb.calc_total必须带库名前缀,否则报错ERROR 1360 (HY000): Trigger does not exist - 输出不含
DELIMITER,而过程/触发器体中必含分号,直接source会中断;必须人工补上DELIMITER $$开头和结尾的$$
示例命令(保存单个存储过程):
mysql -u root -p -e "SHOW CREATE PROCEDURE mydb.calc_total;" > proc_calc_total.sql
然后手动编辑 proc_calc_total.sql,在第一行插入 DELIMITER $$,在最后一行追加 $$ 和 DELIMITER ;。
触发器同理,但语法更严格:SHOW CREATE TRIGGER mydb.t_user_log; ——库名前缀不可省略。
从全量 dump 中用 sed 精确截取定义块
适合批量处理多个对象,或写成脚本自动化。关键是避免用 grep 单行匹配(容易切掉中间行),改用 sed 跨行提取完整定义块。
触发器提取示例(假设 dump 文件叫 full.sql):
sed -n '/^CREATE DEFINER.*TRIGGER `t_user_log`/,/^$$/p' full.sql > trigger_t_user_log.sql
存储过程类似:
sed -n '/^CREATE DEFINER.*PROCEDURE `calc_total`/,/^$$/p' full.sql > proc_calc_total.sql
要点:
- 正则中的反引号
`是必须的,防止匹配到函数名或注释里的字符串 - 结尾匹配
^$$(行首两个美元符),因为mysqldump默认用DELIMITER $$包裹 routine 定义 - 务必先确认
full.sql确实含目标对象:执行grep -E "^CREATE DEFINER.*(PROCEDURE|TRIGGER)" full.sql | head看一眼
mysqlpump 只导 routine、排除所有表(适合导出全部 routine)
MySQL 5.7+ 自带的 mysqlpump 支持比 mysqldump 更细的对象控制,但它仍不支持“只导某几个 routine”,只能做到“导全部 routine + 排除所有表”。
命令示例:
mysqlpump --user=root --password --routines --exclude-tables=% mydb > routines_only.sql
说明:
-
--exclude-tables=%表示排除所有表(包括视图),但保留routines、triggers、events - 导出的触发器仍绑定原表名,若目标库缺失对应表,
source会报ERROR 1217 (HY000): Cannot delete or update a parent row类错误 - 该方式导出的 SQL 默认含
DELIMITER $$,可直接source,无需手动补
如果你真只需要某几个过程,这个方案还是得配合后续 sed 截取——它只是帮你省掉了表结构和数据的干扰项。


















