mysqldump默认不导出视图和函数,必须显式添加--routines参数,并配合--no-create-info、--no-data、--no-tablespaces才能安全迁移;导入前需确保依赖对象存在且用户权限、SQL模式兼容。

视图和函数不会自动随表一起迁移,必须显式导出并重建。只用 mysqldump 默认参数导出表结构和数据,SHOW CREATE VIEW 和 SHOW CREATE FUNCTION 的语句根本不会出现——这是最常被忽略的根源。
导出时必须加 --routines 且禁用表结构/数据
默认 mysqldump 不包含存储过程、函数、视图定义。即使加了 --routines,如果没控制其他参数,仍可能混入表结构或数据,导致导入失败或覆盖已有对象。
-
--routines是必需项:它让mysqldump输出CREATE FUNCTION和CREATE VIEW语句 -
--no-create-info必须加上:否则会导出CREATE TABLE,干扰目标库已有表结构 -
--no-data必须加上:避免把表数据也写进同一个 SQL 文件,增大文件体积且易出错 -
--no-tablespaces推荐加上:防止因源库启用了表空间(如innodb_file_per_table=OFF)而产生不兼容语句
正确命令示例:mysqldump -u root -p --routines --no-create-info --no-data --no-tablespaces mydb > views_and_functions.sql
导入前必须确认依赖表已存在
视图本质是封装好的 SELECT 查询,创建时会校验所引用的表是否存在、字段名是否拼写正确。函数同理,若内部调用了某张表或另一个函数,而该对象在目标库尚未建立,CREATE VIEW 或 CREATE FUNCTION 会直接报错退出。
- 先导入基础表结构(用
mysqldump --no-data单独导出),再导入视图和函数 - 若函数里用了
DEFINER = 'user'@'host',而目标库没有该用户,创建会失败;要么提前建好用户,要么手动编辑 SQL 文件删掉或改写DEFINER子句 - MySQL 8.0+ 默认启用
sql_mode = 'STRICT_TRANS_TABLES',若源库是宽松模式,函数里隐式类型转换可能在目标库报错,需提前检查
导入后必须验证可执行性,不只是“能创建”
成功执行 mysql -u root -p mydb 只代表语法通过,不代表视图能查、函数能调。很多迁移后才发现 <code>SELECT * FROM my_view 报错 Unknown column,或 SELECT my_func(1) 返回 NULL 而不是预期值。
- 对每个视图,执行
SELECT COUNT(*) FROM view_name LIMIT 1;确保不报错 - 对每个函数,用典型输入值调用一次,比如
SELECT my_date_format('2025-01-01');,比对返回结果是否与源库一致 - 检查
information_schema.VIEWS和information_schema.ROUTINES中对象数量是否与源库完全相等
最容易被跳过的环节是 DEFINER 权限和 SQL SECURITY 设置——它们不报错,但会导致函数在某些用户上下文下调用失败;还有字符集隐式转换问题,比如源库表用 utf8mb4_unicode_ci,目标库默认是 utf8mb4_0900_as_cs,视图里字符串比较行为可能突变。这些没法靠自动化脚本发现,必须人工抽样验证逻辑。


















