企业运维训练营之数据库原理与实践—云数据库备份与恢复—数据库备份恢复原理(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 企业运维训练营之数据库原理与实践—云数据库备份与恢复—数据库备份恢复原理(上)

二、 数据库备份恢复原理

 

image.png

 

进行逻辑备份时会涉及很多库表,比如备份a表时花费10秒钟,而开始备份b表时已经是10秒钟以后的数据,会导致数据不一致。此类问题如何解决?

 

MySQL能够通过事务与各种日志保证数据一致性。

 

MySQL的主流引擎是InnoDB,是一个事务型引擎。事务的4个特性为原子性、一致性、隔离性与持久性,以上四个特性能够完整描述出事务的样子。事务有两个状态,分别为成功或失败,失败后可以回滚。事务与事务之间互相隔离,不同的隔离级别看到的数据会略有不同。事务提交后,不管发生宕机或其他事件,数据都需要能够保存在磁盘上。而一致性主要通过其他三种特性共同保证。

 

事务4个特性的实现主要依靠3个日志文件:

 

Redo log:记录数据更新后的值。保证能够落盘,因此可以用来恢复未写入data file的已成功事务更新的数据。原先的存储大多使用随机IO,而Redo log使用顺序IO,速度可以得到大幅提升。同时,原先的存储数据分布非常零散,更新几个列值需要多次IO,而顺序IO的场景下能够大幅减少IO次数。综上,Redo log的目的主要有保证数据的持久性以及提升速度。

 

Undo log:记录数据被更新前的镜像值,保证数据能够回滚。主要用于事务多版本并发控制以及原子性。

 

Binlog:Binlog存在于 server 层,会记录所有提交的DML与DDL,用于做主从复制、数据恢复或同步。为了保证binlog数据的一致性,MySQL采用2阶段提交。

 

以下举例说明Redo与Undo之间的关系。假设a、b两个数据值都为500,a减100、b加100的事务行为如下:

 

首先,事务开始,记录a=500到Undo log。修改为a=400,并记录到Redo log。事务的写流程都为先写Undo log再写Redo log,因此后续流程为记录b=500到Undo log,记录b=600到Redo log,最终事务提交。LSN是日志序列号,用于记录数据库里面数据的一致性位置,主要存在于data buffer和redo buffer。

 

事务提交之后即落盘,但是在如果在提交过程中发生了crash,数据库会做recover,先前滚,再回滚,流程如下:

 

确定恢复起点checkpoint_LSN,然后对比LSN号,应用redo log中最新的日志文件数据,达到crash前一刻状态。最后对prepare状态事务进行回滚,数据状态恢复正常。这也是两阶段事务提交的具体逻辑。

 

上图右侧为MySQL内存与磁盘的结构。

 

image.png

 

逻辑备份是数据库层面对象级别的备份,主流工具有mysqldump、Mysqldumper(mysqldump的多线程版本)。

 

物理备份是文件系统层面,比如简单的cp、Rsync、XtraBackup、CDM。

 

快照备份是基于存储或文件系统,不同厂商会有很多类似的工具。

 

image.png

 

我们准备了两个数据库,分别是test2021与test2022,里面分别有两个表。对两个库进行逻辑备份。

 

image.png

 

上图为具体备份流程。首先会对结构进行备份,然后将数据转换成SQL的方式,执行SQL与DDL。

 

image.png

 

上图中32 Init DB test2022表示开始备份test2022库。首先,将t1表和test_user表上锁,不允许写。备份完成后,将两个表解锁,然后开始进行test2021库的备份。

 

上述流程存在两个问题

 

首先,备份时不能写入

其次,先对a库进行备份,完成后再对b库进行备份。假设a库备份花费10分钟,则b库的数据是 10 分钟之后的数据,会存在不一致的问题。

 

image.png

 

single-transaction参数解决了一致性问题与锁问题。

 

上图流程可见,首先设置了rr的隔离级别,能够解决换读问题。Start transaction 表示开启了一致性快照,通过事务方式读取数据,保证了数据的一致性。

 

image.png

 

上图可见,备份时并没有加锁,只是通过事务来保证一致性。

 

master-data主要用于获取Binlog位置,搭建主从关系时使用。

 

image.png

 

Flush tables with read lock表示对整个库加了只读锁,再设置为rr隔离级别,开启一致性读事务。做完show master status后,进行unlock,然后进行备份流程。

 

single-transaction利用事务机制保证一致性。而如果数据库里有非事务引擎表,我们提供了lock-all-tables参数用于锁定所有表,以保证一致性。该参数日常使用较少,因为会造成比较大的影响。因此,云上库不支持myisam 引擎表。运维或设计时,建议尽量使用事务性引擎表。


接下篇:https://developer.aliyun.com/article/1224054?spm=a2c6h.13148508.setting.19.7b3f4f0enhBQlF

相关文章
|
2月前
|
关系型数据库 OLAP API
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
117 19
|
2月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
65 11
|
3月前
|
弹性计算 安全 关系型数据库
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。
|
3月前
|
运维 监控 Cloud Native
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
90 0
|
2月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
1月前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
167 42
|
24天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
124 25
|
12天前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
19天前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
2月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
493 0

热门文章

最新文章