我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL是如何保证数据的完整性

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL是如何保证数据的完整性

数据的一致性和完整性对于在线业务的重要性不言而喻,如何保证数据不丢呢?今天我们就探讨下关于数据的完整性和强一致性,MySQL做了哪些改进。

一. MySQL的二阶段提交

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

1. redo log

redo log又称重做日志文件,详细的记录了对每一个数据页里面的数据行的修改,记录的是数据修改之后的值。Redo log是用来做数据库crash recovery的,是保证数据安全的非常重要的功能之一。

redo log的写入的方式是顺序写、循环写,通过innodb_log_file_size和innodb_log_files_in_group两个参数控制redo log的文件大小和个数。redo log在写入磁盘前会先写redo log buffer中,大小由innodb_log_buffer_size控制。日志在写入redo log buffer后是如何持久化到磁盘的呢?为了控制redo log的写入策略,Innodb根据innodb_flush_log_at_trx_commit参数不同的取值采用不同的策略,它有三种不同的取值:

  • 1. 设置为 0 的时候:事务提交时由MySQL的后台Master线程每隔1秒将缓存区的文件刷新到日志文件中。
  • 2. 设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘,保证了事务日志不丢失,但会对数据库性能稍有影响。
  • 3. 设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 日志文件中,但不会刷盘,由文件系统自行刷磁盘。

三种模式下,0的性能最好,但是不安全,MySQL进程一旦崩溃会导致丢失一秒的数据。1的安全性最高,但是对性能影响最大,2的话主要由操作系统自行控制刷磁盘的时间,如果仅仅是MySQL宕机,对数据不会产生影响,如果是主机异常宕机了,同样会丢失数据。

2. 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控制:

  • 1. sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
  • 2. sync_binlog=1 的时候,表示每次提交事务都会执行 fsync,将数据刷盘;
  • 3. 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写入文件并刷盘,此时事务已经铁定要提交了。

具体异常场景分析:

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

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

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

二. Double Write

    前面我们说了,redo log、binlog以及二阶段提交保证了数据在MySQL异常重启后能够通过前滚和回滚恢复数据。MySQL在recovery时通过redo log进行恢复,redo log记录的是页上的物理操作,但是这里有个问题,如果页本身就是错的,比如发生页的部分写问题(页大小是 16K,假设在把内存中的脏页写到数据库的时候,写了4K 突然掉电。也就是前两 4K 是新的,后 12K 是旧的,那么这个数据页就是不完整的,是一个坏掉的数据页), 这时redo恢复的时候会去校验数据页的完整性,此时数据页已经损坏了,故无法使用 redo log 进行恢复,这个数据就丢失了。

Double Write原理:

当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至double write buffer。

然后从double write buffer分两次写入磁盘共享表空间中,每次写入 1MB。

最后再从double write buffer写入数据文件。虽然数据总是写入两次,但是由于double write 写入的时候是顺序写,实际上也就牺牲了系统性能的 10%左右。

这样就可以解决上文提到的部分写失效的问题,因为在磁盘共享表空间中已有数据页副本拷贝,如果数据库在页写入数据文件的过程中宕机,在实例恢复时,可以从共享表空间中找到该页副本,将其拷贝覆盖原有的数据页,再应用重做日志即可。

3. 小结

    今天我们聊了MySQL的二阶段提交和double write机制,分别解决了在MySQL宕机重启以及发生页的部分写的场景下,MySQL是如何做到不丢失数据。那如果我们的操作系统宕机无法启动了,又该怎么办呢?MySQL在集群架构中又做了哪些优化来保证数据不丢失呢?我们下一章再来和大家分享MySQL在集群架构中的优化改进。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL是如何保证数据的完整性

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL是如何保证数据的完整性

数据的一致性和完整性对于在线业务的重要性不言而喻,如何保证数据不丢呢?今天我们就探讨下关于数据的完整性和强一致性,MySQL做了哪些改进。 一. MySQL的二阶段提交 在Oracle和MySQL这种关系型数据库中,讲究日志先行策略
2022-06-01

Oracle中的数据完整性如何保证

在Oracle中,数据完整性可以通过以下几种方式来保证:主键约束:主键约束是一种在表中唯一标识每条记录的约束,可以确保表中的每条记录都有一个唯一的标识,防止重复数据的插入。外键约束:外键约束用来确保在两个表之间建立关系时,子表中的外键值必顠
Oracle中的数据完整性如何保证
2024-04-09

Java Hessian 是否能保证数据的完整性?(java hessian能保证数据的完整性吗 )

在Java开发中,Hessian是一种常用的远程调用协议,用于在不同的Java应用程序之间进行数据传输。然而,对于Hessian是否能保证数据的完整性,这是一个值得探讨的问题。Hessian是一种二进制序列化协议,它将Java对象序列化为二进制数据,并在网络
Java Hessian 是否能保证数据的完整性?(java hessian能保证数据的完整性吗  )
Java2024-12-17

Teradata如何保证数据的一致性和完整性

Teradata通过以下方式保证数据的一致性和完整性:ACID事务: Teradata使用ACID(原子性、一致性、隔离性和持久性)事务来确保数据操作的一致性和完整性。这意味着数据操作要么完全成功,要么完全失败,以确保数据始终处于一致的状态
Teradata如何保证数据的一致性和完整性
2024-04-09

MySQL中如何确保数据的一致性和完整性

在MySQL中,可以通过以下方式来确保数据的一致性和完整性:使用主键和外键约束:定义主键和外键可以确保数据表之间的关系,避免数据之间的不一致性。使用触发器:可以通过触发器来在数据插入、更新或删除前后执行特定的操作,从而确保数据的完整性。使用
MySQL中如何确保数据的一致性和完整性
2024-04-09

MongoDB如何确保数据完整性

MongoDB通过以下几种方式来确保数据的完整性:数据验证规则:MongoDB支持在集合级别设置数据验证规则,可以定义数据的结构,数据类型以及其他限制条件,确保插入的数据满足规则。唯一索引:可以在集合中创建唯一索引,确保指定的字段的数值是唯
MongoDB如何确保数据完整性
2024-05-07

如何确保Hadoop数据的准确性和完整性

确保Hadoop数据的准确性和完整性可以通过以下几种方式来实现:数据采集过程中的数据质量控制:在数据采集阶段,应该对数据进行有效的清洗和验证,确保数据的准确性和完整性。可以使用数据质量工具来帮助识别和纠正数据质量问题。数据存储和处理过程中的
如何确保Hadoop数据的准确性和完整性
2024-02-29

Teradata中怎么保证数据的安全性和完整性

Teradata提供全面的数据安全性和完整性保障措施:数据加密:静态数据加密和传输层安全加密。访问控制:基于角色的访问控制和细粒度访问控制。数据完整性保护:校验和、哈希、主键、外键、触发器和约束。审计和监控:审计追踪、监控和警报。安全管理:集中安全管理和定期安全审核。其他安全措施:数据掩码、数据匿名化、防火墙和入侵检测系统,确保数据免受未经授权的访问、篡改和丢失。
Teradata中怎么保证数据的安全性和完整性
2024-04-09

Teradata中怎么保证数据的安全性和完整性

在Teradata中,可以采取以下措施来确保数据的安全性和完整性:访问控制:通过对用户和角色进行权限管理,限制用户对数据库和表的访问权限,防止未经授权的访问和操作。数据加密:对数据进行加密存储和传输,确保数据在传输和存储过程中不被窃取或篡改
Teradata中怎么保证数据的安全性和完整性
2024-04-09

Linux下exit函数如何确保数据完整性

在 Linux 下,当程序正常退出时,可以使用 exit() 函数关闭打开的文件:确保所有打开的文件都已经关闭。这样可以确保缓冲区中的数据被写入到文件中,从而保证数据完整性。释放动态分配的内存:如果程序中使用了动态内存分配(如 malloc
Linux下exit函数如何确保数据完整性
2024-09-09

如何确保数据与人工智能的完整性?

如果说数据是数字经济的新石油,那么人工智能(AI)就是蒸汽机。好似石油和蒸汽机为运输提供燃料,并推动工业革命一样,掌握数据与人工智能力量的公司同时也掌握着创新关键。

怎么保证Redis序列化数据的完整性与安全性

要保证Redis序列化数据的完整性与安全性,可以采取以下措施:使用合适的序列化机制:选择合适的序列化机制可以确保数据的完整性和安全性。常见的序列化机制包括JSON、MessagePack、Protobuf等,可以根据具体需求选择最适合的序列
怎么保证Redis序列化数据的完整性与安全性
2024-04-29

如何确保学校管理系统的MySQL表结构的数据完整性?

如何确保学校管理系统的MySQL表结构的数据完整性?随着时代的发展,学校管理系统越来越普及,在大学、中学甚至小学的日常管理中都发挥着重要的作用。学校管理系统使用MySQL数据库来存储和管理各种数据,而数据库的表结构的数据完整性是保证数据质量
如何确保学校管理系统的MySQL表结构的数据完整性?
2023-10-31

编程热搜

目录