删除无用视图后MySQL备份报错1356,求解决方案
解决mysqldump备份因无效视图报错1356的方案
问题根源
删除废弃视图后仍有残留的无效视图(比如xyz),它依赖的表/列/函数已不存在,或者视图的定义者/调用者权限不足,而mysqldump默认使用LOCK TABLES时会校验视图有效性,因此触发报错。
具体解决方案
1. 彻底清理无效视图(推荐)
先找出所有无效视图,直接删除即可:
- 运行以下SQL查询定位无效视图:
SELECT table_schema, table_name FROM information_schema.views WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys') AND NOT EXISTS ( SELECT 1 FROM information_schema.tables WHERE tables.table_schema = views.table_schema AND tables.table_name = REPLACE( SUBSTRING_INDEX(SUBSTRING_INDEX(views.view_definition, 'FROM ', -1), ' ', 1), '`', '' ) );
- 对查询结果里的视图(比如
xyz)执行删除:
DROP VIEW IF EXISTS `你的库名`.`xyz`;
替换你的库名为实际数据库名称。
2. 修改备份命令绕过校验(临时应急)
如果暂时不想清理视图,可通过参数让mysqldump跳过锁表或视图校验:
- 针对InnoDB表推荐:用
--single-transaction替代锁表,保证一致性同时跳过视图校验:
/usr/bin/mysqldump --all-databases --events --single-transaction > "some_file_name"
- 跳过特定问题视图:明确指定忽略有问题的视图:
/usr/bin/mysqldump --all-databases --events --ignore-table=你的库名.xyz > "some_file_name"
- 跳过锁表操作:直接禁用
LOCK TABLES,但MyISAM表可能出现备份不一致:
/usr/bin/mysqldump --all-databases --events --skip-lock-tables > "some_file_name"
3. 修复无效视图(若需保留)
如果xyz视图仍有用,可修复它:
- 查看视图原始定义:
SHOW CREATE VIEW `你的库名`.`xyz`;
- 根据定义重新创建依赖的表,或者修改视图SQL指向有效的对象。
内容的提问来源于stack exchange,提问作者troppapolvere
相关产品推荐
相关产品推荐

