是,mysqldump默认导出触发器,但需用户有TRIGGER权限且未指定--skip-triggers;--no-create-info会禁用触发器导出,--no-data不影响;恢复失败主因是DEFINER不存在、依赖对象缺失、DELIMITER未识别或执行顺序错误。

触发器不会单独存在,它绑定在表上,所以备份恢复必须和表结构一起处理——但默认行为容易被忽略,直接导致恢复后触发器“丢了”。
mysqldump 是否默认导出触发器?
是,但有条件:只要用户有 TRIGGER 权限,且没加 --skip-triggers,mysqldump 就会在导出表结构时附带触发器定义。但注意:
-
--no-create-info会连带禁用触发器导出(因为没建表语句,就没地方挂触发器) -
--no-data不影响触发器,只要表结构在,触发器就导出 - 用
--databases或--all-databases备份时,触发器仍受同一规则约束 - 检查备份文件里有没有
DELIMITER ;;和CREATE TRIGGER块,这是最直接的验证方式
恢复时触发器没生效的常见原因
不是 dump 没导出,而是导入过程出了问题:
-
DEFINER='user'@'host'在目标库不存在 → 报错ERROR 1449 (HY000),需提前加--skip-definer或用sed 's/DEFINER[^*]*\*/\*/g'清洗 - 触发器引用了已删的字段或函数 → 报错
ERROR 1351或ERROR 1305,必须先确保表结构、函数、视图都就位 - 备份中用了
DELIMITER ;;,但恢复时客户端未识别该分隔符 → 在 MySQL 客户端里执行前,先运行DELIMITER ;; - 导入顺序错乱:比如先
DROP TABLE再重建,但触发器定义在文件末尾 → 整个 SQL 文件必须一次性执行,不能拆开手动跑
只提取某个触发器定义的实操方法
别用 grep -A N,它会截断多行体或混入下一个对象。可靠做法是用 awk 精准匹配边界:
awk '/^CREATE TRIGGER.*my_trigger$/{f=1; next} f && /^DELIMITER ;$/{f=0; exit} f' backup.sql
说明:
- 从
CREATE TRIGGER my_trigger行开始(严格匹配行尾,避免命中my_trigger_log) - 持续输出直到遇到独立一行的
DELIMITER ;(前后无空格) - 不依赖行数,能正确处理嵌套分号、换行、注释
- 若备份用了
DELIMITER ;;,把结尾条件改成/^DELIMITER ;;$/
真正容易被忽略的是:触发器定义必须在对应表创建之后、数据插入之前执行。哪怕提取对了语句,如果手工贴到错误位置或漏掉 DELIMITER 切换,CREATE TRIGGER 就会语法报错或静默失败。


















