mysq如何保证数据的可靠性

2024-09-04 00:08
文章标签 可靠性 保证数据 mysq

本文主要是介绍mysq如何保证数据的可靠性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. redo log

2. binlog

3. 两阶段提交


MySQL这种关系型数据库中,讲究日志先行策略,只要日志持久化到磁盘,就能保证MySQL异常重启后,数据不丢失。在MySQL中,提到日志不得不提的就是redo log和binlog。

1. redo log

事物在执行过程中,生成的redo log是要先写到redo log buffer的。redo log buffer里面的内容并非每次生成后都要直接持久化到磁盘的。

如果事物执行期间MySQL发生异常重启,那这部分日志就丢了。由于事物并没有提交,所以这时日志丢了也不会有损失。

事物还没提交的时候,redo log buffer中的部分日志也有可能被持久化到磁盘。这个问题需要从redo log 可能存在的三种状态说起:

  1. 存在redo log buffer中,物理上是在MySQL进程内存中;
  2. 写到磁盘(write),但是没有持久化(fsync),物理上是在文件系统的page cache 里面;
  3. 持久化到磁盘,对应的是hard disk。

日志写到redo log buffer是很快的,write到page cache也差不多,但是持久化到磁盘的速度就慢多了。为了控制redo log 的写入策略,InnoDB提供了innodb_flush_log_at_trx_commit参数,它有三种可能取值:

  • 设置为0的时候,表示每次事物提交时都只是把redo log 留在redo log buffer 中;
  • 设置为1的时候,表示每次事物提交时都将redo log直接持久化到磁盘;
  • 设置为2 的时候,表示每次事物提交时都只是把redo log写到page cache。

InnoDB有一个后台线程,每隔1秒,就会把redo log buffer中的日志,调用write 写到文件系统的page cache,然后调用fsync 持久化到磁盘。

注意:事物执行中间过程的redo log 也是直接写在redo log buffer 中的,这些redo log也会被后台线程一起持久化到磁盘。也就是说,一个没有提交的食物的redo log,也是可能已经持久化到磁盘的。实际上,除了后台线程每秒一次的轮询操作外,还有两种场景会让一个没有提交的食物的redo log 写入到磁盘中:

1、redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程会主动写入到磁盘中。由于这个事物并没有提交,所以这个写盘动作只是write,而没有调用fsync,也就是只留在了文件系统的page cache。

2、并行的事物提交的时候,顺带将这个事物的redo log buffer持久化到磁盘。

 

2. binlog

binlog的写入逻辑比较简单:事物执行过程中,先把日志写到binlog cache,事物提交的时候,再把binlog cache写到binlog文件中。

binlog又称二进制日志,记录了对MySQL数据库执行更改的所有操作,不包含select和show操作,主要起到了恢复、复制、审计等功能。Binlog的格式主要有statement、row、mixed三种。

Statement:基于操作的SQL语句记录到binlog中,不建议使用。

Row:基于行的变更情况记录,会记录行更改前后的内容,row模式也是数据库不丢数据的重要保证,推荐使用。

Mixed:混合前两个模式,不建议使用。

Binlog的写入逻辑也比较简单:事务执行过程中,先写入binlog cache,事务提交时再写入binlog文件。binlog cache由binlog_cache_size和max_binlog_size参数控制,每个线程分配一个binlog cache,但是共用binlog文件。

Binlog的写入日志文件的机制由sync_binlog控制:

  • sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
  • sync_binlog=1 的时候,表示每次提交事务都会执行 fsync,将数据刷盘;
  • sync_binlog=N(N>1) 的时候,表示n次事务提交之后,MySQL才进行一次fsync动作,将binlog cache中的数据刷入磁盘。

innodb_flush_log_at_trx_commit和sync_binlog都设置为1是MySQL数据中经典的双一模式,是数据库不丢数据的保障。

MySQL数据采取WAL机制就是为了减少每次脏数据刷盘带来的性能影响,如果设置”双一”策略会不会影响数据库的性能呢?其实这主要得益于redo log和binlog都是顺序写,磁盘的顺序写比随机写的速度要快的多,加上MySQL内部的组提交机制,已经大幅降低了对磁盘的IOPS消耗了。

 

3. 两阶段提交

MySQL引入二阶段提交(two phase commit or 2pc),MySQL内部会将普通事务当做一个XA事务(内部分布式事务)来处理,会自动为每个事务分配一个唯一的ID(XID),COMMIT会被动的分成Prepare和Commit两个阶段。

第一阶段:Transaction Prepare Phase

此时SQL已经成功执行,并生成xid信息及redo和undo的内存日志。然后调用prepare方法完成第一阶段,将事务状态设为TRX_PREPARED,并将redo log刷盘。

第二阶段:Commit Phase

如果事务第一阶段进入prepare阶段,则将产生的binlog写入文件并刷盘,此时事务已经铁定要提交了。

具体异常场景分析:

1. 当事务在prepare阶段crash,数据库recovery的时候该事务未写⼊Binary log并且存储引擎未提交,则该事务rollback。

2. 当事务在binlog阶段crash,此时⽇志还没有成功写⼊到磁盘中,启动时会rollback此事务。

3. 当事务在binlog⽇志已经fsync()到磁盘后crash,但是InnoDB没有来得及commit,此时MySQL数据库recovery的时候将会读出⼆进制⽇志的Xid_log_event,然后告诉InnoDB提交这些XID的事务,InnoDB提交完这些事务后会回滚其它的事务,使存储引擎和⼆进制⽇志始终保持⼀致。

MySQL的二阶段提交就保证了数据库在异常宕机重启后的数据不丢失。

 

参考:

https://www.it610.com/article/1294243353461858304.htm

https://zhuanlan.zhihu.com/p/183731242

这篇关于mysq如何保证数据的可靠性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134431

相关文章

技术干货 |如何保障 IM以及音视频的系统稳定性、安全性、可靠性?看这篇就懂!

在当今快节奏的商业环境下,to B 行业客户对产品质量的要求越来越高,尤其是对于 IM 及音视频服务端稳定性的要求更加突出。随着技术的不断进步,这些服务的使用量不断攀升,因此稳定性建设显得尤为重要。从技术角度上,需要重视系统性能、可靠性、安全性等方面的提升,在流程上需要建立完善的开发、测试、部署流程,以确保服务端稳定性的提高。同时,需要加强对于系统监控、故障排查、灾备恢复等方面的投入,避免服务中断

综合自动化变电所运行的可靠性

摘 要:自动化技术在变电所中的有效利用,一方面能够通过网络信息平台落实远程变电操控的需要,使变电所的工作质量与效率得到显著提升,并增强变电系统的可控性;另一方面,凭借可靠性检测措施,更便于管理人员探查变电系统运行潜在风险,以便及时将参数传递至检修平台,使变电质量得以保障。本文基于自动化变电所特征展开分析,期望凭借可靠性理论为变电系统运维工作开展提供良好参照。 关键词:自动化;变电运行;安装调节;

【电子通识】可靠性机理之电偶腐蚀

什么是电偶腐蚀         电偶腐蚀也叫以异金属腐蚀或接触腐蚀,是指两种不同电化学性质的材料在与周围环境介质构成回路时,电位较正的金属腐蚀速率减缓,而电位较负的金属腐蚀加速的现象。构成这种现象的原因是这两种材料间存在着电位差,形成了宏观腐蚀原电池。         例如,用铁铆钉联结的铜板在潮湿的空气中会发生接触腐蚀,铁为阳极,发生溶解而被腐蚀;碳钢和铜相接触,在同一电解液中组成的电偶,使

消息中间件:深入理解 Kafka的消息顺序和一致性、可靠性和高可用性 第1版

消息中间件:深入理解 Kafka的消息顺序和一致性、可靠性和高可用性 第1版 Kafka 是一种分布式消息中间件,它能够处理大规模的实时数据流,是现代分布式系统中的关键组件。作为高吞吐量、低延迟、强扩展性和高容错的消息系统,Kafka在各种场景中都表现出了卓越的性能。本文将深入探讨 Kafka 的适用场景、消息顺序与一致性保证、高可用性机制等关键知识点。 文章目录 消息中间件:深入

网络协议 TCP 如何保证数据的有序无误传输

如何保证数据的有序无误传输 1.如何保证有序传输2.如何保证传输的无误性 上一节讲了 网络协议 TCP 数字编号和重传机制,其实已经变相的说明了这个问题。 1.如何保证有序传输 首先说,TCP 不同与UDP ,TCP 是有序的,那么是如何保证有序的,数据在发送后,可能经过不同路径,这样到达目的地时的顺序可能会与发送时不同,后发先到是一件很平常的事,网络层是不会保证数据的有

如何评估云服务器提供商可靠性与信誉度

在云计算时代,选择一个可靠和信誉良好的云服务器提供商对于个人用户和企业来说至关重要。以下是评估云服务器提供商可靠性与信誉度的关键指标和方法: 1. 服务水平协议(SLA): 可用性承诺: 查看云服务器提供商的SLA,了解其对系统可用性的承诺,通常以百分比表示,如99.9%。 故障处理: 了解SLA中关于故障处理时间和补偿机制的条款,以确保在出现故障时能够及时得到解决和补偿。 2. 安全性能

程序员面试题之分布式锁,分布式场景中的数据一致性问题一直是一个比较重要的话题,其中的核心就是分布式锁。在大多数系统设计时我们一般会牺牲掉强一致性来保证数据的最终一致性,这需要我们合理地使用分布式锁

【常见的分布式锁】 当前比较常见的分布式锁主要有基于Redis分布式锁、基于zookeeper分布式锁以及数据库乐观锁。 基于数据库的实现方式的核心思想是:在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。

关闭公网mysq的shell脚本

#!/bin/sh#添加mysql配置sed -i '22c #server {' /usr/local/webserver/nginx/conf/nginx.confsed -i '23c # listen 3307;' /usr/local/webserver/nginx/conf/nginx.confsed -i '24c # proxy_connect_timeout 1s;

设计数据密集型应用 第一章:可靠性,可伸缩性,可维护性

第一章:可靠性,可伸缩性,可维护性 原文地址 互联网做得太棒了,以至于大多数人将它看作像太平洋这样的自然资源,而不是什么人工产物。上一次出现这种大规模且无差错的技术, 你还记得是什么时候吗? ——阿兰·凯在接受Dobb博士杂志采访时说(2012年) 文章目录 第一章:可靠性,可伸缩性,可维护性关于数据系统的思考可靠性硬件故障软件错误人为错误可靠性有多重要? 可伸缩性描述负载

TCP vs UDP:揭秘可靠性与效率之争

概述 今天我们开始主要讲解TCP的相关知识点。在之前讲解分层章节的时候,我们提到过一个重要观点。在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它。然而,在网络中的通信往往是进程间的通信,而不是机器间的通信。因此,TCP协议引入了端口的概念。一个端口只能被一个进程占用,这样就可以为运行在不同主机上的应用进程提供直接的通信服务。 运输层的任务是