【实战分享】MySQL 备份遇到 Got error: 1356 报错?这几种解决方式了解一下!

在日常 MySQL 备份中,是否遇到过类似的报错信息?

mysqldump: Got error: 1356: View 'xxx.view_xxx' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them when using LOCK TABLES

这正是我们今天要讨论的问题 —— mysqldump 在备份视图(View)时遇到 1356 错误。如果你也踩过这个坑,那么这篇文章你一定要看完。


📌 问题复现:Got error: 1356 是什么?

这个错误常出现在使用 mysqldump 导出数据库时,尤其是数据库中包含失效或异常的视图时。

报错示例:

mysqldump: Couldn't execute 'SHOW FIELDS FROM `view_person_jg`': 
View 'xxx.view_person_jg' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them (1356)

常见原因:

  • 视图引用的原始表已被删除或改名

  • 视图的定义者(definer)权限不足

  • 视图中使用了无效的函数或字段


✅ 解决方案汇总

方案一:忽略视图,仅备份表结构与数据

如果视图对你来说不是必须的核心数据,可以先跳过视图,仅备份表:

mysqldump -u root -p --all-databases --ignore-table=your_db.view_name > backup.sql

视图可以单独导出定义:

mysqldump -u root -p --no-data --routines --triggers --events your_db > backup_views.sql

👍 优点:减少 mysqldump 整体失败风险,备份流程更灵活。


方案二:使用 --force 选项跳过报错对象

mysqldump -u root -p --all-databases --force > backup.sql

✅ 强制忽略错误视图,让备份不中断,适合快速拉取全量数据的场景。


方案三:使用 mysqlpump 工具备份(MySQL 5.7+)

mysqlpump -u root -p --default-parallelism=2 --all-databases > backup.sql

🚀 优点:

  • 支持并行备份,更快

  • 可忽略部分报错对象

  • 功能更强大,推荐使用


🔍 进阶处理:备份前如何主动排查无效视图?

为了避免每次备份出错,我们可以提前通过脚本检测数据库中所有“已失效的视图”,避免踩坑。

步骤一:使用存储过程检测无效视图

以下是一个兼容 MySQL 8.0 的视图检测脚本,可以检测当前数据库中是否存在依赖已删除表的视图。

CALL check_invalid_views();

完整过程脚本见文末附录。

结果示例:

schema_nameview_nameerror_msg
your_dbview_person_jgTable 'your_db.test_table' doesn't exist

步骤二:处理这些无效视图

  • 视图不再使用 → 删除

DROP VIEW your_db.view_person_jg;
  • 表仍然有备份 → 还原表或重建视图

CREATE OR REPLACE VIEW your_db.view_person_jg AS
SELECT * FROM restored_table;

🧠 总结:哪种方案适合你?

方案场景命令
忽略视图、先备表视图不重要或单独处理--ignore-table
强制备份不中断忽略异常继续备份--force
并行+容错数据量大、视图较多mysqlpump
提前检测失效视图主动预防失败SQL + 存储过程

💬 最后

MySQL 中的视图是数据逻辑层的延伸,但在备份中却可能成为“坑”。

本篇文章结合实战和原理,为大家梳理了多种应对思路,希望你在处理 mysqldump 报错时不再一头雾水。

如果你在生产环境中遇到更复杂的视图依赖问题,也欢迎在评论区留言,一起交流更多实战技巧!


📎 附录:检测无效视图的存储过程

👇建议保存本段代码为 SQL 文件,部署到数据库中定期执行。

DELIMITER $$

DROP PROCEDURE IF EXISTS check_invalid_views$$
CREATE PROCEDURE check_invalid_views()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE v_schema VARCHAR(64);
  DECLARE v_view VARCHAR(64);
  DECLARE err_msg TEXT DEFAULT '';
  DECLARE error_occurred BOOL DEFAULT FALSE;

  DECLARE cur CURSOR FOR
    SELECT TABLE_SCHEMA, TABLE_NAME 
    FROM information_schema.VIEWS
    WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys');

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  DROP TEMPORARY TABLE IF EXISTS invalid_views;
  CREATE TEMPORARY TABLE invalid_views (
    schema_name VARCHAR(64),
    view_name VARCHAR(64),
    error_msg TEXT
  );

  OPEN cur;
  read_loop: LOOP
    FETCH cur INTO v_schema, v_view;
    IF done THEN
      LEAVE read_loop;
    END IF;

    SET @sql_text = CONCAT('SELECT 1 FROM `', v_schema, '`.`', v_view, '` LIMIT 1');
    SET error_occurred = FALSE;

    BEGIN
      DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET error_occurred = TRUE;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END;

    IF error_occurred THEN
      GET DIAGNOSTICS CONDITION 1 err_msg = MESSAGE_TEXT;
      INSERT INTO invalid_views(schema_name, view_name, error_msg)
      VALUES(v_schema, v_view, err_msg);
    END IF;

  END LOOP;
  CLOSE cur;

  SELECT * FROM invalid_views;
END$$

DELIMITER ;

免费备考资料分享(红帽、甲骨文、华为)

为了帮助更多考生高效备考,我根据自己的学习经验,整理了以下几个核心备考资料:

  1. 考试大纲
    覆盖HCIE笔试和实验考试的所有重点知识,帮助你精准掌握考试范围,避免盲目学习。

  2. 培训教材
    详细的理论知识和案例分析,核心技术的深入解析,是夯实基础的不二之选。

  3. 实验手册
    实验考试配置命令速查手册和模拟实验案例集,涵盖关键场景,助你在实验环节高效应对。

获取方式
如果你需要这些备考资料,可以在评论区留言或者私信我,我会将资料打包发给你,希望对你的备考有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值