mysqldump 备份报错 1356:View references invalid table 解决记录

5次阅读
没有评论

现象

执行全库备份命令:

mysqldump -h127.0.0.1 -uroot -p --all-databases > all.sql

输入密码后直接报错中断:

mysqldump: Couldn't execute 'show create table `device_driver_car`': View 'greencar.device_driver_car' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them (1356)

原因说明

device_driver_car 是失效视图。 视图只是存储的查询定义,不是真实数据表,平时业务不访问它的时候不会暴露问题,mysqldump 导出时会执行 show create table 读取视图元数据,触发 1356 错误导致备份终止。 常见根因:

  1. 视图依赖的底层表、字段、存储过程 / 函数被删除或者改名;
  2. 视图 DEFINER 对应的数据库账号已经被删除;
  3. definer 账号缺少依赖表的访问权限;
  4. 迁移、删表操作后视图残留,变成僵尸无效视图。

重点:视图本身元数据还在,但是逻辑已经无法正常执行。

应急方案(优先拿到可用备份)

方案 1:–force 跳过报错继续导出(最常用)

--force 参数遇到报错视图时,会把该视图定义注释写入 SQL 文件,备份流程不中断。 生产 InnoDB 库建议带上一致性备份参数:

mysqldump -h127.0.0.1 -uroot -p --force --single-transaction --routines --triggers --all-databases > all.sql

⚠️ 重要提醒:--force 只是绕过备份中断,不会修复视图,导入恢复之后这个视图依旧无法使用,后续需要单独处理。

方案 2:单独忽略坏视图,不导出它

mysqldump -h127.0.0.1 -uroot -p --ignore-table=greencar.device_driver_car --all-databases > all.sql

MySQL 8.4+ 新增 --ignore-views 参数,可以直接跳过全部视图:

mysqldump -h127.0.0.1 -uroot -p --ignore-views --all-databases > all.sql

根治方案:修复或清理无效视图

1. 查询视图元信息(definer、定义语句)

SELECT table_name,definer,security_type,view_definition
FROM information_schema.VIEWS
WHERE table_schema='greencar' AND table_name='device_driver_car';

2. 验证视图可用性

SELECT * FROM greencar.device_driver_car LIMIT 1;
  • 如果同样 1356 报错:视图已经失效。
    • 业务还在使用:找到原始建视图语句,CREATE OR REPLACE VIEW 重建;
    • 业务不再使用:直接删除视图:
DROP VIEW greencar.device_driver_car;

3. Definer 权限 / 账号异常处理

如果是 definer 用户不存在或者缺权限:

  1. 重建对应的数据库账号,授予依赖底层表的 SELECT 权限;
  2. 重建视图,修改 DEFINER 为有效账号,或者改为调用者安全模式 SQL SECURITY INVOKER。

扩展:批量扫描实例内所有视图,提前发现坏视图

SELECT CONCAT(table_schema,'.',table_name) AS view_name
FROM information_schema.VIEWS
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql','sys')
ORDER BY table_schema,table_name;

拿到视图列表后,循环执行 select 校验,提前巡检,避免备份踩坑。

总结

  1. 1356 本质是视图损坏 / 权限异常,不是 mysqldump 工具 bug;
  2. 紧急备份优先 --force,先保障数据落盘;
  3. 长期运维不要一直依赖 –force,定期巡检视图,清理无效僵尸视图;
  4. 视图迁移、删表操作后,一定要核对关联视图有效性。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码