现场是这样的。CentOS 7.9 上跑 MySQL 5.7,每天用 mysqldump 做全库备份,恢复演练时发现存储过程和触发器都不见了,表数据是完整的,备份脚本里只写了 --single-transaction 和 --databases。
中间走过弯路,把「事件调度器里的任务要 --events 才会带上」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。mysqldump 默认不导出存储过程和函数,要显式加 --routines;触发器默认也不导出,需要加 --triggers;备份账号没有权限读 mysql.proc,导出时被静默跳过。
上来先确认备份文件里有没有例程定义
grep -c 'CREATE.*PROCEDURE' backup.sql
随后重新导出并带上例程和触发器
mysqldump -uroot -p --single-transaction --routines --triggers --events --all-databases > full.sql
恢复前检查 DEFINER 指向的账号
grep -i 'DEFINER=' full.sql | head
等前面都确认过,再导入后核对对象数量
mysql -uroot -p -e "select count(*) from information_schema.routines where routine_schema='app'"
别只看报错消失,验证要多做一步。恢复后存储过程、函数、触发器的数量与源库一致,调用存储过程返回结果正常。
提醒一点。DEFINER 指向的账号在目标库不存在时,导入会报错或对象不可用,跨环境恢复前先确认账号。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
