mysqldump无法直接导出单个存储过程或触发器,必须通过SHOW CREATE PROCEDURE/FUNCTION/TRIGGER逐个提取,或查询information_schema拼接SQL;全库导出后grep裁剪风险高且受权限版本限制。

不能直接用 mysqldump 指定单个存储过程或触发器名导出——它只支持按库或按表粒度导出,mysqldump 没有 --procedure=my_proc 或 --trigger=before_insert_log 这类参数。想精准提取某几个对象,得绕道查系统表 + 拼接 SQL。
用 SHOW CREATE 逐个提取指定对象
这是最可靠、权限要求最低的方式,不需要 SUPER 或 BACKUP_ADMIN,只要有 SELECT 权限和对应对象的 EXECUTE/TRIGGER 权限即可。
-
SHOW CREATE PROCEDURE mydb.my_proc返回完整创建语句,含DEFINER和SQL SECURITY -
SHOW CREATE FUNCTION mydb.my_func同理,注意函数名不带括号 -
SHOW CREATE TRIGGER mydb.my_trigger必须带库名前缀,否则报错 “Unknown trigger” - 结果是单行结果集,可重定向到文件:
mysql -u user -p -e "SHOW CREATE PROCEDURE mydb.p_update_cache" > p_update_cache.sql
用 information_schema 筛选后批量生成脚本
当要导出多个(但非全部)过程/触发器时,手动敲 SHOW CREATE 太累,改用查询 information_schema 拼接:
- 查指定过程:
SELECT CONCAT('DELIMITER ;;\n', ROUTINE_DEFINITION, ';;\nDELIMITER ;') FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='mydb' AND ROUTINE_NAME IN ('p1','p2'); - 查指定触发器:
SELECT CONCAT('DELIMITER ;;\n', ACTION_STATEMENT, ';;\nDELIMITER ;') FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA='mydb' AND TRIGGER_NAME IN ('t_log_insert'); - 注意:
ROUTINE_DEFINITION在 MySQL 8.0+ 默认被隐藏(需show_create_routine权限),5.7 可见;ACTION_STATEMENT是触发器主体,不含CREATE TRIGGER头部,得自己补
mysqldump 能否“间接”实现?
可以,但必须接受“导出整个库再裁剪”的工作流,且对权限和版本敏感:
- 先全量导出:
mysqldump -u root -p --routines --triggers --no-data --no-create-info mydb > full_routines.sql - 再用
grep提取目标对象:grep -A 20 "CREATE DEFINER.*PROCEDURE.*my_proc" full_routines.sql(-A 20防止跨行截断) - 风险点:如果过程体里有注释或换行多,
grep -A容易漏内容;触发器名若含下划线,正则要转义 - 托管环境(如阿里云 RDS)常禁用
SUPER,--routines会静默失效——此时full_routines.sql里根本没CREATE PROCEDURE,但你完全看不出
真正需要“指定导出”的场景,SHOW CREATE 是唯一稳态路径;所有基于 mysqldump 的方案都隐含权限、版本、裁剪精度三重不确定性,尤其在生产迁移中,DEFINER、SQL_MODE、binlog_format 的连锁影响很容易被忽略。


















