必须加--routines参数,否则动态sql完全丢失;definer导致跨平台导入失败需清理或创建用户;注意换行符、路径硬编码及5.7→8.0权限差异。

mysqldump --routines 必须加,否则动态SQL直接丢失
不加 --routines 参数,mysqldump 生成的 SQL 文件里根本不会出现 CREATE PROCEDURE 或 CREATE FUNCTION 语句——哪怕过程体里全是 CONCAT + PREPARE + EXECUTE 这类动态 SQL,也一并被跳过。这是最常被忽略的前提。
- 必须显式加上
--routines,例如:mysqldump -u root -p --routines --databases mydb > backup.sql - 如果只导出例程(不含表结构和数据),用
--no-create-info --no-data组合更干净 -
--routines同时导出 PROCEDURE 和 FUNCTION,无法按类型过滤,后续需手动分离
DEFINER 导致导入失败是 Windows→Linux 迁移的高频报错
Windows 上导出的存储过程默认带 DEFINER=`winuser`@`localhost`,Linux 目标库若无该用户,执行 source backup.sql 会立即报错:ERROR 1449 (HY000): The user specified as a definer ('winuser'@'localhost') does not exist。
- 开发/测试环境:在导入前执行
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';,并用sed -i 's/DEFINER=[^;]*;//g' backup.sql清除 DEFINER(等效于改用SQL SECURITY INVOKER) - 生产环境:先在 Linux 目标库创建同名用户,再赋权:
CREATE USER 'winuser'@'localhost' IDENTIFIED BY 'pwd'; GRANT EXECUTE ON mydb.* TO 'winuser'@'localhost'; - MySQL 8.0.26+ 可用
--skip-definer参数替代 sed,但需确认目标版本支持
动态 SQL 中的路径、换行符、引号在跨平台时容易出错
Windows 默认 CRLF 换行,Linux 是 LF;动态拼接的 SQL 字符串若含硬编码路径(如 'C:\temp\data.txt')或双反斜杠转义,在 Linux 下执行会报语法错误或文件找不到。
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 避免在存储过程中硬编码操作系统路径,改用参数传入或配置表管理
- 导出后用
dos2unix backup.sql统一换行符(Linux 目标机上运行) - 检查动态 SQL 字符串里的单引号嵌套:Windows 客户端可能自动补双单引号,Linux 下需确保是标准 SQL 转义(如
''表示一个单引号) - 若过程内调用
LOAD_FILE()或SELECT ... INTO OUTFILE,路径必须重写为 Linux 格式(/tmp/data.txt),且目标目录权限要对mysql用户可读写
MySQL 5.7 和 8.0 对 PREPARE/EXECUTE 的权限校验更严格
MySQL 8.0 默认开启 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,且 mysql.proc 表已废弃,改查 mysql.routines。5.7 导出的含动态 SQL 的过程,在 8.0 导入时可能因权限缺失或语法松散被拒绝。
- 导入前在目标库执行:
SET GLOBAL log_bin_trust_function_creators = 1;(仅限有 SUPER 权限用户) - 确认目标库用户有
EXECUTE权限(不只是SELECT),否则调用过程时报ERROR 1370 (42000): execute command denied to user - 若过程使用
SQL SECURITY DEFINER,定义者用户必须存在且有对应数据库的EXECUTE权限,不能只靠GRANT ALL - 8.0 中
PREPARE的变量作用域更严格,避免在循环内重复PREPARE stmt FROM @sql而不DEALLOCATE PREPARE stmt,否则可能报ERROR 1243 (HY000)
跨操作系统迁移动态 SQL 存储过程,真正卡住人的从来不是语法本身,而是 DEFINER 权限链、换行符隐式污染、以及 5.7→8.0 权限模型切换时那几条没显式声明的 EXECUTE 权限。做完 mysqldump --routines,别急着导入,先打开 backup.sql 扫一眼 CREATE 语句头三行——DEFINER 在不在?有没有 CRLF?有没有 Windows 路径?这三处扫完,剩下就是权限补全的事了。










