现象
执行全库备份命令:
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 错误导致备份终止。 常见根因:
- 视图依赖的底层表、字段、存储过程 / 函数被删除或者改名;
- 视图
DEFINER对应的数据库账号已经被删除; - definer 账号缺少依赖表的访问权限;
- 迁移、删表操作后视图残留,变成僵尸无效视图。
重点:视图本身元数据还在,但是逻辑已经无法正常执行。
应急方案(优先拿到可用备份)
方案 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 用户不存在或者缺权限:
- 重建对应的数据库账号,授予依赖底层表的 SELECT 权限;
- 重建视图,修改 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 校验,提前巡检,避免备份踩坑。
总结
- 1356 本质是视图损坏 / 权限异常,不是 mysqldump 工具 bug;
- 紧急备份优先
--force,先保障数据落盘; - 长期运维不要一直依赖 –force,定期巡检视图,清理无效僵尸视图;
- 视图迁移、删表操作后,一定要核对关联视图有效性。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)