mysqldump无法直接指定导出单个存储过程或触发器,因其--routines和--triggers仅为全库/全表级开关;需用--no-create-info --no-data --routines --triggers --databases组合导出全部逻辑对象,或用show create procedure/show create trigger手动提取并补全delimiter。

mysqldump 没有原生命令能“只导出某几个存储过程”或“只导出某几个触发器”,但可以组合参数逼近“仅逻辑对象(不含表结构/数据)”的目标。关键在于理解 --routines 和 --triggers 的行为边界,以及它们与 --no-create-info、--no-data 的配合逻辑。
为什么不能直接用 --routines --triggers 加个过滤名?
mysqldump 的 --routines(或 -R)和 --triggers(或 -E)都是全库/全表级开关,不是对象名筛选器:
-
--routines会导出当前库中所有PROCEDURE和FUNCTION,无法指定proc_a或func_b -
--triggers同样是批量导出——它依赖表存在,会在对应CREATE TABLE后插入触发器定义;单独启用时,若没带表名或--databases,可能静默失效 - 不存在类似
--include-routine=xxx或--trigger-name=t_user_log的参数
只导全部 routine + 触发器(不含表结构/数据)的正确写法
这是最常用、最可控的“纯逻辑备份”方式,适用于灰度前备份、迁移前校验等场景:
- 导出整个库的所有存储过程、函数、触发器,但跳过表结构和数据:
mysqldump -u root -p --no-create-info --no-data --routines --triggers --databases mydb > routines_and_triggers.sql - 必须加
--databases(或--all-databases),否则--routines和--triggers可能不生效 -
--no-create-info剔除CREATE TABLE语句;--no-data剔除INSERT;二者合用才能干净只留逻辑对象 - 注意:该命令仍会包含
CREATE DATABASE和USE,如不需要,可用sed '/^CREATE DATABASE\|^USE /d' routines_and_triggers.sql > clean.sql清理
想只导某一个存储过程或触发器?用 SHOW CREATE 手动提取
这是唯一精准、跨版本、不依赖权限读系统表的方式(MySQL 5.7+ 和 8.0+ 都支持):
- 提取单个存储过程:
mysql -u root -p -e "SHOW CREATE PROCEDURE mydb.calc_total;" > proc_calc_total.sql - 提取单个触发器(必须带库名前缀):
mysql -u root -p -e "SHOW CREATE TRIGGER mydb.t_audit_insert;" > trigger_t_audit_insert.sql - ⚠️ 关键坑:
SHOW CREATE不输出DELIMITER,如果过程体里有分号,直接source会报错;必须人工在开头加DELIMITER $$,结尾加$$,再把原DELIMITER ;替换掉 - 权限要求低:只要对目标对象有
EXECUTE权限即可,无需SELECT访问mysql.routines或information_schema.TRIGGERS
恢复时 DEFINER 报错怎么办?别硬提 SUPER 权限
备份文件里带 DEFINER=`user`@`host`,还原到新环境常报 ERROR 1418 或 Access denied; you need the SUPER privilege:
- MySQL 5.7.8+ 导出时加
--skip-definer,生成语句自动设为DEFINER=CURRENT_USER或省略DEFINER子句 - 老版本或已有备份文件,用
sed 's/DEFINER=[^ ]* //g' backup.sql > clean.sql清理(注意别误删注释里的字符串) - 千万别在目标库给普通用户开
SUPER——MySQL 8.0+ 已移除该权限,且违背最小权限原则 - 更稳妥做法:恢复前先
DROP PROCEDURE IF EXISTS xxx;,避免ERROR 1304 (42000): PROCEDURE xxx already exists
真正难的不是“怎么导”,而是“导出来能不能直接跑”。SHOW CREATE 提取的定义必须补 DELIMITER,mysqldump 生成的文件要检查是否真含目标对象(权限不足时会静默跳过),而恢复失败往往卡在 DEFINER 或对象依赖顺序上——这些细节比命令本身更容易被忽略。











