mysql 5.7 函数定义存于 mysql.proc 表,8.0 改用数据字典表(如 mysql.routines),升级需元数据迁移;若迁移失败(如 proc 表清空、升级中断、跨版本跳过等),函数将永久丢失,仅可通过 mysqldump --routines 备份导入、show create function 手动重建或旧实例导出恢复。

不是权限丢了,是函数定义本身从数据字典里消失了——MySQL 5.7 和 8.0 存储函数的位置和方式完全不同。
mysql.proc 表在 8.0 中已废弃,但升级时没自动迁移
5.7 及之前版本把函数定义全存在 mysql.proc 表里;8.0 改用数据字典表(如 mysql.routines、mysql.parameters),升级过程必须触发元数据迁移。但以下情况会让迁移失败:
- 升级前
mysql.proc表已被手动清空或字段错乱 - 升级中途
mysqld被 kill 或崩溃,迁移脚本没跑完 - 自定义
my.cnf禁用了skip-grant-tables却没配好权限校验,导致系统表初始化卡住 - 从 5.5 直接跨到 8.0,跳过了中间版本过渡
此时 proc.MYD 文件可能还在磁盘上,但 8.0 的 server 根本不读它。
log_bin_trust_function_creators 配置只是“开关”,不是“备份”
这个变量控制是否允许创建函数,但它不保存函数定义。迁移后即使设为 ON,也不会让已消失的函数自动回来。常见误操作:
- 以为只要开这个参数就能恢复函数——其实它只影响后续
CREATE FUNCTION是否被拒绝 - 导出时没加
--routines参数,mysqldump根本不包含函数定义 - 导入时没指定数据库名:
mysql -u root -p 默认进 <code>test库,函数建在了错误位置
直接拷贝 .MYD/.ibd 文件或硬灌旧版 mysql 库会彻底损坏实例
有人想“抄近路”,把 5.7 的 mysql/proc.ibd 拷进 8.0 的 data 目录,结果:
- 8.0 的 InnoDB 不识别老格式的系统表空间
- 启动时报
ERROR 1067 (42000): Invalid default value for 'created'等字段缺失错误 - 整个
mysql库变不可用,连root都登不上
真正能用的恢复路径只有三条:有 mysqldump --routines 备份就直接导入;旧库还能连就用 SHOW CREATE FUNCTION 手动重建;只剩文件就用 5.7 的 mysqld 临时启出来导出定义——别碰二进制文件。
最常被忽略的一点:函数定义一旦从 8.0 的数据字典里清空,就无法通过 ibd2sql 或 ALTER TABLE ... IMPORT TABLESPACE 恢复,因为新版本根本不再解析旧结构。











