从RDS(兼容MySQL) 导出数据案例分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

作者:丁奇 

背景

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”字样,则返回严重错误,终止备份恢复流程。

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
消息中间件 关系型数据库 Kafka
一种小资源情况下RDS数据实时同步StarRocks方案
使用一台4C8 G服务器轻松实现2个MySQL实例中通过负责分库分表规则之后的5000多张表的数据实时同步到StarRocks
155 67
|
4月前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
137 2
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
506 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
87 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
77 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
2月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
209 0
|
5月前
|
关系型数据库 MySQL Serverless
函数计算产品使用问题之调用RDS MySQL的步骤是怎样的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
SQL 关系型数据库 MySQL
MySql⭐一、配置MySql数据库,并创建一个表单
MySql⭐一、配置MySql数据库,并创建一个表单
|
5月前
|
开发框架 前端开发 关系型数据库
ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据
ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据
下一篇
DataWorks