一个mysqldump导出失败的案例分析

 背景

MySQL全量逻辑备份恢复最基础的方法,就是mysqldump生成文本,再通过source 命令直接导入。一般用于实例迁移或者版本升级。

这里说明最近碰到的一个失败例子。

描述

这个例子可以简要复现如下,在源库上执行如下操作:

use mydb;

create table t1 (id int);

create view v1 as select * from t1;

drop table t1;

 

之后执行 mysqldump mydb,发现mysqldump中途退出。简化后出错原因很明显,就是视图v1对应的表t1已经不存在,这个视图本身非法。

这个错误很危险,因为如果没有捕获这个错误,直接认为mysqldump执行完成,并将生成的结果应用于目标库,则会导致数据丢失!

其实这个问题并不像看起来那么简单。

一个问题

mysqldump只需要生成show create view v1的结果即可----这会导致在目标库source的时候报错----为什么会在dump的时候就报错?

MySQL Tips: mysqldump导出整库,默认情况下,会在导出前对整库里面的每个表加读锁,即Lock tables tb1 read, tb2 read,..., tbn read.

​本例中由于视图v1需要的实体表t1已经不存在,lock table v1 read 返回失败。因此整个库所有表都没有正常导出。如果以此输出结果导入到目标库,则整库数据丢失。

MySQL Tips: mysqldump若正常结束,生成的文件结果最后一行是“-- Dump completed on + 时间”。

​使用dump的结果文件必须先检查结果文件的完整性,判断末行的文本是一个推荐操作。

 

导整库的时候为什么需要对所有表都加读锁呢?目的是为了得到一致性读视图。也就是说,在导出整库期间,不会有更新,这样才保证导出数据的一致性。

 

而实际上这个是历史遗留问题,InnoDB本身支持一致性读,也就是说只要启动一个事务(begin/start transaction),则在此事务存续期间,对于本实例内InnoDB表的更新,此导出事务均不可见。也就是说InnoDB事务可以保证事务期间看到的视图与事务启动瞬间看到的一致。

 

而锁表会堵住更新,导库又往往是长时间的操作,因此备份期间能允许读写对OLTP应用来说至关重要。

MySQL Tips: 若确保mysqldump导出的数据中只有InnoDB表,可以用 --single-transaction 避免锁表。

问题继续

加了--single-transaction后不需要锁表,是否还会导致mysqldump失败?答案依然是会。这次我们发现输出的错误是 "SHOW FIELDS FROM v1" 失败。由于show fields v1需要解析视图并列出执行结果的列信息,而表t1已经不存在因此报错。

 

问题是,为什么需要执行一个 SHOW FIELDS?

 

这就说到restore的依赖问题。

 

MySQL Tips: mysqldump生成导出文件时。同一个库内实体表先生成,之后是视图。多个实体表是按照字母升序生成,多个视图也是按字母升序生成。

这样就可能存在这样的情况,某个视图v1依赖视图v2,而v1的字母排序前于v2。比如视图名为x,而依赖的另一个视图名为y。这样在按顺序输出的时候,如果不做任何处理,在输出文件中就会先出现create view x ...而由于x依赖于y但y还没有生成,就会导致restore阶段执行失败。

 

MySQL Tips: mysqldump解决视图依赖问题的方法,就是在生成实体表阶段,如果碰到视图,则创建一个同名的临时实体表,该表的结果与视图完全相同。

配合的策略是在生成真正的视图前,先将临时实体表删除。这样在restore阶段,创建任何视图V1前,它所依赖的视图V2有两种情况:

1) 字母排序V2 > V1,则当前库中有一个名为V2的临时实体表,这样视图V1能够正常创建;

2) 字母排序V2 < V1,则此时视图V2已经存在,这样视图V1能够正常创建;

 

以上策略解决了视图循环依赖的问题,这个机制需要早生成实体表阶段得到视图执行结果的列名,因此需要执行一个 SHOW FIELDS。

实践建议

上面的分析说明了"为什么”,以下操作型的读者希望的实践建议:

1) 为避免无效视图影响导出,可以在调用mysqldump时增加--force参数,强行忽略此错误。这个忽略不会对数据造成影响;

 

2) 使用--result-file参数保存mysqldump结果,同时将所有控制台收到的返回都作为报警返回给调用端;

 

3) 检查 result-file的最后一行,若无“Dump completed on"字样,则返回严重错误,终止备份恢复流程。

 

 

Windows 2008 R2虚拟机跑金蝶K3 WISE 12.1的5个关键配置细节(附避坑清单) 本文详细介绍了在Windows Server 2008 R2虚拟机中部署金蝶K3 WISE 12.1的5个关键配置细节,包括服务器角色与账户权限、组件服务调优、数据库与中间层协同部署、补丁管理策略及性能优化工具。这些实战经验可帮助企业IT团队避免常见陷阱,确保ERP系统稳定运行。 阅读详情

相关推荐

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 504

华大HC32F460从零到200MHz:手把手教你配置时钟系统(附避坑指南)

本文详细解析了华大HC32F460 MCU的时钟系统配置,从启动过程、时钟树分析到实战配置200MHz系统时钟。文章手把手指导开发者如何正确配置外部晶振、MPLL锁相环及总线分频,并提供了硬件检查、代码解读及常见问题排查的避坑指南,帮助用户从零构建稳定可靠的高性能时钟环境。

net55的博客 297

mysqldump 导出 导入 导入没反应 无数据

-- dump 导出备份 并压缩 mysqldump -h -u root -p –password tablename | gzip > /usr/local/db_backup/tablename-`date +%Y%m%d%H%M%S`.sql.gz -- 解压 gzip -d tablename-20220xxxxx0000.sql.gz -- 导入数据 mysql -h localhost -p3306 -uroot –password tablename < /usr/.

yyfjm1994的博客 1330

Android应用加固脱壳实战:从爱加密原理到Frida内存Dump与修复

在移动应用安全领域,代码加固与动态加载是保护核心逻辑的关键技术。其原理在于通过修改应用启动流程,将原始DEX加密隐藏,并注入包含解密逻辑的壳DEX,实现运行时动态加载。这项技术的核心价值在于防止应用被逆向分析、二次打包或恶意篡改,广泛应用于金融、游戏等高安全要求场景。对于安全研究、漏洞挖掘或历史版本审计,掌握脱壳技能至关重要。本文聚焦于**爱加密**等主流加固方案,深入探讨如何利用**Frida**框架在内存中精准捕获解密后的DEX数据,并解决脱壳后常见的签名校验等运行问题,提供一套从原理到实践的完整攻防思

weixin_28716443的博客 490

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

809

mysqldump数据导出问题和客户端授权后连接失败问题

1,使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的。 mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to y...

immense的博客 488

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5723

判断mysqldump是否成功

tail -n 1 xxx.sql 来查看sql文件。 如果有dump completed on 日期。说明dump成功了,有时候因为会话中断等原因,dump失败,就没有这一行。

qq_44821149的博客 917

【AI智能体】Coze 数据库从使用到实战操作详解

Coze 数据库使用到实战详解

congge 5916

Python爬虫实战:逆向解析天猫商品详情API,精准捕获规格、SKU与促销活动

及浏览器开发者工具),绕过前端渲染的复杂性,直接逆向分析并调用其内部数据接口,从而高效、稳定地抓取商品的关键信息,包括商品规格、多维度SKU信息以及复杂的促销活动。print(f"SKU ID: {sku.sku_id}, 价格: ¥{sku.price}, 库存: {sku.stock}, 规格: {sku.props}")当你访问一个商品链接时,浏览器首先会加载一个几乎为空的HTML骨架,然后通过执行大量的JavaScript代码,向后台服务器发起多个异步请求,最终将获取到的数据填充到页面中。

2201_76125261的博客 1129

mysql dump 导入_使用mysqldump导入不成功解决方法

今天遇到个奇葩的问题,使用mysqldump导出数据库,命令如下:mysqldump -u root -p密码 数据库名 >/tmp/mysql_data.sql,在使用导入时,执行成功,显示-- MySQL dump 10.13 Distrib 5.7.11, for Linux (x86_64)---- Host:localhost Database: apt----------...

weixin_39622760的博客 1093

CAPL概述与环境搭建

CANoe和CANalyzer是Vector公司开发的两款用于汽车电子系统开发和测试的工具。CANoe主要用于网络开发、仿真和测试,而CANalyzer则主要用于网络分析和诊断。两者都支持CAPL脚本语言,可以用于编写复杂的测试脚本和仿真模型。CAPL Browser是CANoe/CANalyzer中用于编写、编辑和调试CAPL脚本的工具。它提供了一个集成的开发环境,支持语法高亮、代码自动补全、调试等功能。菜单栏:包含文件操作、编辑、编译、调试等功能。工具栏。

闲人编程的博客 1665

mysql数据库导入视图表失败_一个mysqldump导出失败的案例分析

背景MySQL全量逻辑备份恢复最基础的方法,就是mysqldump生成文本,再通过source 命令直接导入。一般用于实例迁移或者版本升级。这里说明最近碰到的一个失败例子。描述这个例子可以简要复现如下,在源库上执行如下操作:use mydb;create table t1 (id int);create view v1 as select * from t1;drop table t1;之后执行 ...

weixin_33147807的博客 1355

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【MySQL】mysqldump使用方法

本文介绍MySQL数据库mysqldump常用方法。

2404_89421557的博客 3338

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mysqldump导出数据库视图_mysqldump导出视图数据库

从RDS(兼容MySQL) 导出数据案例分析作者:丁奇背景MySQL全量逻辑备份恢复最基础的方法,就是mysqldump生成文本,再通过source 命令直接导入。一般用于实例迁移或者版本升级。这里说明最近碰到的一个失败例子。描述这个例子可以简要复现如下,在源库上执行如下操作:use mydb;create table...文章阿里云柳璃2014-06-052466浏览量RDS for MySQL...

weixin_39773215的博客 1782

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用mysqldump导出多表到一个文件

今天详细使用了MySQL导出导入工具mysqldump.exe和mysql.exe mysqldump.exe默认导出为单insert语句的形式,当记录多时,mysql.exe导入不了,用--extended-insert=false显示关闭才可以;导出的表如果有触发器,会默认一起导出,导入会报告触发器重复了(mysql不允许一个表有多个同类触发器),也要用--triggers=false

1万+

mysqldump导出中文乱码

解析流程:UTF-8→{codepage}→UTF-16。导入失败原因:UTF-8→UTF-16出现mysql不接受的字符。乱码原因:powershell 5.1默认配置下codepage为936,UTF-8→GBK输出错误。

weixin_51914600的博客 400

解决 Mysqldump不能导出大表的一种有效办法

项目里有一套MySQL 主从库集群,一主两从,操作系统为Centos 7.9,MySQL版本为8.0.28.在运行过程中,有一个从库经常性的同步失败,采取的措施执行”reset slave”,然后再从头开始同步,由于同步的基准位置比较大(偏移量数值),同步会耗费很长的时间,甚至有时候会失败。准备一个同版本的数据库系统,编辑MySQL选项文件“/etc/my.cnf”,设置“server_id=10240”、“gtid-mode = on”等,完整的文件内容如下(读者可根据自己的环境自行修改)。

linux硬派运维 796

mysqldump导入导出语句大全详解

mysqldump -u用户名 -p密码 -h主机 数据库 a -w "sql条件" --lock-all-tables > 路径.详解..    mysqldump备份还原和mysqldump导入导出语句大全详解 mysqldump备份: mysqldump -u用户名 -p密码 -h主机 数据库 a -w "sql条件" --lock-all-tables > 路径

long5493的专栏 773

【DevOps】Mysqldump 使用详解

Mysqldump 是 MySQL 数据库中一个功能强大的工具,可以帮助您轻松备份和恢复数据库。本文介绍了 Mysqldump 的基本用法、高级技巧和常见问题解决方案,希望能够帮助您更好地使用 Mysqldump。建议定期备份您的数据库,以防止数据丢失。备份数据时,请注意数据安全,避免将备份文件存储在容易被攻击的地方。备份后,请测试数据是否完整,确保备份成功。其他工具。

TradingAgents-CN专栏 2731

MySQL命令--使用mysqldump导出导入数据库

本文介绍mysql使用mysqldump命令导出导入数据库的方法。

IT利刃出鞘的博客 3436

java外部命令mysqldump 条件导出数据问题

Runtime.getRuntime().exec()参数问题 java导出mysql数据 Process process = Runtime.getRuntime().exec(execCMD); int processComplete = process.waitFor(); if (processComplete == 0) { ...

m0_37967720的博客 593

shell脚本: mysqldump命令使用位置参数传参导出mysql指定库表

他们(shell脚本执行者)朝我扔位置参数,我拿位置参数构建指定的mysqldump命令导出指定库表的sql文件到指定目录。没座(没错)!

m0_71629429的博客 611
上一篇: MySQL 聚集UDF,计算列表中的奇数总和
下一篇: 各版本MySQL并行复制的实现及优缺点
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值