最常见原因是原库DEFINER用户在目标库不存在或当前用户无模拟权限;需导出时用mysqldump --routines --no-create-info,再手动将SQL中DEFINER=old_user@%替换为CURRENT_USER或目标库存在的高权限账号。
DEFINER 权限问题最常导致失败函数迁移后调用报错 ERROR 1449 (HY000): The user specified as a definer ('user1'@'%') does not exist,本质是原库的 DEFINER 用户在目标库不存在,或当前用户无权模拟该用户执行。
mysqldump --routines --no-create-info,但默认保留 CREATE DEFINER=... 语句DEFINER=`old_user`@`%` 为 DEFINER=CURRENT_USER 或目标库已存在的高权限账号(如 DEFINER=`root`@`localhost`)mysql -u root -p 执行,确保连接用户有 SET USER 权限;否则改用 --skip-definer(MySQL 8.0.28+)或在导入前执行 SET SQL_LOG_BIN = 0; 避免复制中断
触发器绑定在具体表上,迁移后若表名大小写不一致(尤其在 Linux 目标机 + lower_case_table_names=0),或源表用 MyISAM、目标表用 InnoDB,都可能使触发器失效甚至报错 ERROR 1635 (HY000): Trigger does not exist 或无法激活。
lower_case_table_names 值,目标库需设为相同值(重启生效),否则 mysqldump 生成的 DROP TRIGGER 语句会因大小写不匹配找不到对象ALTER TABLE t ENGINE=InnoDB
log_bin_trust_function_creators 必须显式开启只要函数/触发器里含 SELECT、INSERT 等非确定性操作,且开启了二进制日志(log_bin=ON),MySQL 就会拒绝创建,报错 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA —— 即便你加了 DETERMINISTIC 也无效,因为校验优先级更高。
my.cnf 中添加:[mysqld] log_bin_trust_function_creators = 1
SET GLOBAL log_bin_trust_function_creators = 1;,但需 SUPER 权限,且重启后失效MySQL 5.7 升 8.0 是高频场景,但 NEW.column_name 在 BEFORE INSERT 触发器中赋值语法被严格限制,且部分函数如 FOUND_ROWS() 行为变更,容易引发逻辑错误而非报错。
NEW 字段做子查询赋值(如 SET NEW.id = (SELECT MAX(id)+1 FROM t)),会报 ERROR 1356 (HY000): View 'db.t' references invalid table(s) or column(s)
UUID_SHORT() 在 8.0.27+ 返回类型改为 BIGINT UNSIGNED,若旧函数里用 CAST(... AS SIGNED) 处理,可能溢出mysqlpump 替代 mysqldump(尤其 8.0+),它默认处理 DEFIN
ER 和并行导出,且能识别新版语法限制SELECT ROUTINE_NAME, ROUTINE_TYPE, DEFINER FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'db_name'; 和 SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'db_name'; 双向核对对象完整性。