mysqldump默认不导出函数和触发器,必须显式添加--routines和--triggers参数;二者缺一不可,且需确保用户具备SELECT、TRIGGER和EXECUTE权限,否则会静默跳过。

mysqldump 默认不导出函数和触发器,必须显式启用
默认执行 mysqldump 时,即使数据库里有函数、存储过程或触发器,它们也不会出现在导出文件中。这是因为 MySQL 为安全考虑,默认禁用这类对象的导出。你得手动加参数才能让它们被包含进去。
关键参数是 --routines(导出函数和存储过程)和 --triggers(导出触发器)。这两个参数必须显式指定,缺一不可。
-
--routines同时导出FUNCTION和PROCEDURE,不能只选其一 -
--triggers只影响表级触发器(CREATE TRIGGER),不影响事件(EVENT)——事件需额外加--events - 如果目标库启用了二进制日志且你用了
--master-data,触发器导出顺序可能影响恢复一致性,建议搭配--single-transaction(仅对 InnoDB 表有效)
导出时权限不足会静默跳过,不是报错
执行 mysqldump --routines --triggers 时,如果当前用户缺少 SELECT 权限以外的权限(比如对 mysql.proc 表无读取权,或对触发器所在表无 TRIGGER 权限),mysqldump 不会报错,而是直接跳过对应对象——导出文件里就没了,你还以为导全了。
验证权限是否足够:
- 检查是否有
SELECT权限:能查information_schema.ROUTINES和information_schema.TRIGGERS - 检查是否有
EXECUTE权限:对函数/过程本身(部分旧版本要求) - 检查是否有
TRIGGER权限:对每个含触发器的表(MySQL 5.7+ 要求) - 临时提权测试:用
root或带SELECT, TRIGGER, EXECUTE的账号跑一次对比输出
导出文件里函数定义可能带 DEFINER,导致导入失败
导出的函数和触发器 SQL 中通常包含 DEFINER=`user`@`host`,如果目标环境没有这个用户,或者你不想沿用原定义者,导入时会报错 ERROR 1449 (HY000): The user specified as a definer does not exist。
解决方式有两种,按场景选:
- 加
--skip-definer:让mysqldump输出时不写DEFINER,改用当前登录用户(推荐用于开发/测试环境) - 加
--set-gtid-purged=OFF(如果用了 GTID):避免因 GTID 冲突连带影响 DEFINER 处理 - 不加参数时,可在导入前用
sed -i 's/DEFINER=[^*]*\*/DEFINER=CURRENT_USER/g' dump.sql批量替换(生产环境谨慎)
只导出函数或只导出触发器?不行,但可以过滤表
mysqldump 没有单独导出“所有函数”或“所有触发器”的开关。它总是以数据库或表为单位导出,--routines 和 --triggers 是附加行为。
如果你只想处理特定对象,只能靠组合策略:
- 导出整个库 +
--routines --triggers,再用文本工具提取CREATE FUNCTION/CREATE TRIGGER块 - 用
SELECT查询information_schema手动生成 DDL:SELECT ROUTINE_DEFINITION FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='db_name' AND ROUTINE_TYPE='FUNCTION' - 对单张表导出触发器:加表名参数,如
mysqldump --triggers --no-create-info --no-data mydb mytable,此时--routines无效(没指定库或 --all-databases)
真正麻烦的不是导出动作本身,而是 DEFINER 和权限这两块——它们不会在命令行报错,却会在后续导入或迁移时突然卡住。动手前先确认账号权限,导完立刻 grep 一下 dump 文件里有没有 CREATE FUNCTION 或 CREATE TRIGGER 字样。


















