内存刷新机制

red log buffer、data buffer、binlog cache。在O和M中,讲究日志先行策略,就是一条DML语句进入数据库之后,都会先写日志,再写数据文件。

1.red log,

重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败时,重做日志文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用重做日志恢复到掉电前的时刻,以此来保证数据的完整性。

默认情况下至少有两个red log文件,在磁盘上用ib_logfile(0-N)命名。

red log写的方式是顺序和循环写,当写满最后一个文件时,会重新从第一个文件开始写,写满日志文件会产生切换操作,并执行 checkpoint,触发脏页的刷新。MySQL数据库重启过程中,如果参数文件中的red log值大小与当前redo log值不一致,会把现有redo log 删除,并按照参数文件中设置的大小,重新生成新的redo log文件。

(1)在磁盘中生成 red log文件之前,数据是先写在red log buffer中的。

  • 通过innodb_flush_log_at_trx_commit参数来控制。该参数分别为0,1,2
  • 0的含义:red log thread每隔1秒会将red log buffer中的数据写入red log文件,同时进行刷盘操作。保证数据确实写入磁盘。在此参数下,每次事务提交并不会触发red log thread将日志缓冲中的数据写入red log文件。
  • 1的含义:每次事务提交时,都会触发redo log thread将日志缓冲中的数据写入文件,并flush到磁盘。该设置下是最安全的模式。保证数据库在主机断电,OS crash下不会丢失任何已提交的数据。
  • 2的含义:每次事务提交时,都会把redo log buffer的数据写入redo log 文件,但是不会同时刷新到磁盘。

三种模式下:

0性能最好,但是不安全,MySQL进程一旦崩溃会导致丢失一秒的数据。

1是安生性最高,但数据库性能最慢。

2是介于两者之间。

(2)master thread:每秒进行刷新

(3)redo log buffer:使用超过一半的时候会触发刷新。

 

2.binlog

DML语句既会写red log 文件,也会写binlog文件。功能主要用于备份恢复和主从复制。

从binlog cache刷新到磁盘的binlog文件中,需要通过sync_binlog参数来决定。

a.sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息来到磁盘,而让Filesystem自行决定什么时候来做同步,或都cache满了之后才同步到磁盘。

b.sync_binlog=N,每进行N次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

 

++++++++++++++++++++++++++++++++++red log和binlog区别++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

两都都是记录了对数据真实的修改的语句。同时有以下区别:

1.记录内容的不同。

binlog是逻辑日志,记录所有数据的改变信息。

red log记录的是物理日志,记录所有InnoDB表数据的变化。

 

2.记录内容的时间不同。

binlog 记录commit完毕之后的DML和DDLSQL语句。

red log记录事务发起之后的DML和DDL SQL语句。

3.文件使用方式的不同。

binlog不是循环使用,在写满或者实例重启之后,会生成新的binlog文件。

red log是循环使用,最后一个文件写满之后,会重新写第一个文件。

 

4.作用不同。

binlog可以作为恢复数据使用,主从复制搭建。

red log作为异常宕机中都介质故障后的数据恢复使用。

 

有以下关联:

在主从环境中,从库需要通过二进制日志来应用主库提交的事务,但如果主库red log已经提交而二进制日志没有保持一致,则会造成从库数据丢失,主从数据不一致的情况,见以下分析:

MySQL两阶段提交过程:

a.准备阶段(transaction prepare):事务SQL语句先写入redo log buffer,然后做一个事务准备标记,再将log buffer中的数据刷新到redo log.

b.提交阶段(commit):将事务产生的binlog写入文件,刷入磁盘。

再在redo log中做一个事务提交的标记,并把binlog写成功的标记也一并写入red log文件。

结合以下两场景分析两阶段如何保持数据库的一致性:

Sense one:

准备阶段,redo log刷新到磁盘了,但是binlog写盘前发生了MySQL实例crash,这是会发生怎么的操作呢?

即使redo log写盘成功了,但由于binlog未写入成功,我们需要执行回滚操作来保证数据的一致性。

 

Sense two:

提交阶段,binlog写盘成功了,此时MySQL实例发生crash,此时binlog已经确保写成功了,我们在重启实例进行恢复时,只需要让redo log重做一次就可以了。

总结一下:

其实只要binlog写入完成,则在主从复制环境中,都会正常完成事务。

最后看一下脏页的刷新条件:

(1)重做日志ib_logfile文件写满后,在切换的过程中会执行checkpoint,会触发脏页的刷新。

(2)通过innodb_max_dirty_pages_pct参数的值控制。该参数是指在buffer pool中dirty page所占的百分比,达到设置的值,就会触发脏页的刷新。

(3)由innodb_adaptive_flushing参数控制。

转载于:https://www.cnblogs.com/chinaops/p/9634780.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 字符串对齐,android – 使用Spanable String对齐ImageSpan

我知道有很多相同类型的问题可供使用,我尝试了很多解决方案,但所有这些问题都达不到我的要求.我的问题是我必须在包含Spanable字符串和Imagespan的文本之间添加动态行间距,但是当我添加行间距时,文本和图像的对齐会变形.我已经尝试了Stackoverflow上几乎所有可用的解决方案,如t…

如何将JBoss HR员工奖励项目放入云端

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 我们从头到尾讨论了各个层,但尚未为您提供除Red Hat Container Development Kit(CDK)之外的任何应用程序开发工具。 到目前为止,您所拥有…

用JIRA管理你的项目

https://blog.csdn.net/gaowenhui2008/article/details/70241657 (一) JIRA环境搭建 转载于:https://www.cnblogs.com/eustoma/p/9637509.html

ArcGIS编辑操作的常用快捷键一览表

在ArcMap中,快捷键与一些编辑工具和命令相关联。使用快捷键能使编辑工作更加快捷有效,总结如下: 一、公共快捷键(对所有编辑工具有效): Z:放大 X:缩小 C:漫游 V&#xff…

javaone_JavaOne 2012:使用HTML5和Java构建移动应用程序

javaone我返回了Parc 55 (任务会议室),观看Max Katz的( Exadel开发人员关系)“使用HTML5和Java构建移动应用程序” Bird-of-Feather(BoF)演示文稿。 具体来说,Katz在Tiggzi &#xf…

android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...

1.RecyclerView的Item宽度不能全屏显示出现这种的原因有两种:1.第一种是在adapter中加载inflater时parent传入为null2.如果第一种不行,第二种原因就是在RecyclerView外随意加一层布局即可充满解决方法,在onCreateViewHolder按照如下修改&…

剑指offer(一):二维数组中的查找

题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否…

sed以及awk的替换命令

转载自:http://blog.csdn.net/imzoer/article/details/8721590 先看sed 的。 比如说, 在上面使用sed替换每行第一个出现的nau为n_a_u。 如果加上g参数,那么对已一行,每次遇到一个nau就要替换一次。 -----------------------------…

图片下载中文传输转义问题

// 定义utf-8转义失败,中文是一串什么3E%什么的 URLEncoder.encode((productName".jpeg"), "UTF-8") // 改成如下代码 new String((productName ".jpeg").getBytes("utf-8"), "ISO8859-1") 转载于:https://www.…

NetBeans Java EE技巧8:持久性单元

任何好的IDE的基本目标都是简化和组织代码和开发工作流程。 NetBeans在实现这些目标方面做得非常出色,有时我们将基础知识视为理所当然。 例如,如果您曾经试图在纯文本编辑器中阅读XML蒙上了双眼,那么过去在配置和使用Persistence Units时可能…

c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...

对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便。我在《C语言实现双向非循环链表(不带头结点)的节点插入》中详细实现了在不带头结点的情况下的插入。这次我们将会来在使用头结点尾结点的情况下在任意的位置插入元素。代码上传至 https://github.c…

ls实现列文件按时间排序

转载自:http://blog.csdn.net/gtuu0123/article/details/4420424 1) ls -lt 时间最近的在前面 2) ls -ltr 时间从前到后 3) 利用sort ls -l | sort 7 (日期为第8列) 时间从前到后 ls -l | sort -r 7 时间最近的在前面

sqlserver添加默认值

知识点: sql添加字段默认值时:1.如果有加 not null ,则已有记录该字段值更新为默认值2.如果没有加 not null,则为null代码: IF EXISTS ( SELECT TOP 11FROM INFORMATION_SCHEMA.COLUMNSWHERE [TABLE_NAME] Produ…

android服务器 性能,Android性能优化(中)

Android性能优化在上一篇中介绍了性能优化的概念、内存泄漏和性能优化方式Android性能优化(上)我们继续说说Android性能优化数据库性能优化索引简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据&…

jvm系列二之GC收集器

目录 参考概念理解并发和并行吞吐量GC垃圾收集器Serial New收集器Parallel New(并行)收集器Parallel Scavenge(并行)收集器Serial Old(串行)收集器Parallel Old(并行)收集器CMS收集器…

shell脚本中一些特殊符号

在shell中常用的特殊符号罗列如下&#xff1a; # ; ;; . , / \\ string| ! $ ${} $? $$ $* \"string\"* ** ? : ^ $# $ command{} [] [[]] () (()) || && {xx,yy,zz,...}~ ~ ~- & \\<...\\> - % ! # 井号 (…

java 并发执行_Java并发执行器的懒惰开发人员简介

java 并发执行如果我告诉您util.concurrent API自2004年起提供此类服务&#xff0c;我就会自欺欺人。但是&#xff0c;我想回顾一下一些很酷的功能。 并发专家&#xff0c;现在是时候关闭该窗口了。 所有其他人&#xff0c;请保持紧紧的乐趣。 你不会忘记你的根源 执行程序是具…

球球大作战测试服android版,球球大作战10.0体验服

在球球大作战10.0体验服中&#xff0c;2019球球们将迎来全新的冒险&#xff0c;多重外观&#xff0c;更加的绚丽夺目&#xff0c;探索新的地图&#xff0c;与不同的对手较量一番&#xff0c;无限吞噬&#xff0c;热血竞技&#xff0c;灵活的走位&#xff0c;搭配强力道具&#…

单线程的并发,协程

IO多路复用 作用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) setblocking(Flase) 让原本阻塞的变成非阻塞(不等待)状态 import socket import selectsk socket.socket() sk.setblocking(False) try:sk.connect(("www.baidu.com",80)) exce…

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候&#xff0c;经常会涉及到字符串相关操作。有很多命令语句&#xff0c;如&#xff1a;awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号&#xff0c;可以达到类似效果&#xff0c;大家知道&#xff0c;使用内部操作符会省略启动外部程序等…