mysqldump不加--routines不会导出存储过程和函数,触发器还需额外指定--triggers;权限不足(如缺少SHOW ROUTINES或TRIGGER权限)会导致静默跳过;MySQL 5.6默认关闭,5.7+默认开启(需权限支持)。

mysqldump 不加 --routines 就不会导出存储过程和触发器
默认情况下,mysqldump 只导出表结构和数据,PROCEDURE、FUNCTION、TRIGGER 这三类对象完全被忽略——哪怕你用了 --all-databases 或指定了具体库名,只要没显式启用 routines 相关选项,它们就不存在于备份文件里。
实操建议:
- 必须加上
--routines才能导出存储过程和函数(PROCEDURE/FUNCTION) - 触发器(
TRIGGER)需要额外加--triggers;它不包含在--routines里,也不受其影响 - 如果只加了
--routines没加--triggers,恢复后触发器会丢失,但过程和函数还在 -
--routines默认会同时导出CREATE PROCEDURE和CREATE FUNCTION,无需分开指定
加了 --routines 却没导出?检查用户权限是否足够
即使参数写对了,mysqldump 也可能静默跳过 routines 导出——常见原因是连接数据库的账号缺少 SELECT 权限以外的必要权限。
关键权限要求:
- 导出存储过程/函数:需要
SELECT权限 +SHOW ROUTINES权限(注意不是EXECUTE) - 导出触发器:需要对应表的
TRIGGER权限,或全局TRIGGER权限 - 若用
--all-databases,则需全局SHOW ROUTINES和TRIGGER权限 - 错误现象:
mysqldump: Got error: 1142: SELECT command denied to user ... for table 'proc'是典型权限不足提示
--routines 和 --skip-routines 的行为差异与兼容性
--routines 是显式开启,--skip-routines 是显式关闭;二者互斥,后者优先级更高。MySQL 5.7+ 默认开启 routines 导出(只要权限够),但 5.6 及更早版本默认关闭——所以跨版本迁移备份脚本时容易踩坑。
注意事项:
- MySQL 8.0 中
mysql.proc表已被废弃,routines 元数据移至information_schema.routines和information_schema.triggers,--routines内部逻辑已适配,无需调整 - 使用
--set-gtid-purged=OFF时,--routines仍有效,但要注意 GTID 环境下恢复时可能因 DEFINER 权限引发问题 - 如果备份命令中混用了
--routines和--skip-routines(比如配置文件里写了后者,命令行又加了前者),最终以命令行参数为准
导出后验证是否真包含 routines 的简单方法
别等恢复失败才发现问题。备份文件生成后,用几行命令快速确认 routines 是否真的在里面:
- 检查存储过程/函数:
grep -i "CREATE PROCEDURE\|CREATE FUNCTION" backup.sql | head -3 - 检查触发器:
grep -i "CREATE TRIGGER" backup.sql | head -3 - 如果返回为空,说明没导出成功——立刻回查权限或参数,而不是先去试恢复
- 注意:有些编辑器或
cat查看时可能因编码或二进制内容误判,务必用grep这类文本工具直接匹配关键字
DEFINER 子句经常被忽略,但它会影响恢复时的执行权限,尤其是跨环境还原时,CREATE PROCEDURE 语句里的 DEFINER=`user`@`host` 很可能在目标库不存在。










