mysql如何保证redolog和binlog的一致性,安全性,效率。

和数据安转相关的参数

sync_binlog:控制binlog的刷新方式(写入到磁盘)

innodb_flush_log_at_trx_commit:在innodb下控制着redo的写入方式

innodb_support_xa:外部事务,用来保证binlog和redo一致性的,俗称两段式提交

binlog_order_commits:按照binlog的写入顺序提交事务,保证redo和binlog的已执行

binlog_max_flush_queue_time: leader线程搜集binlog的超时时间

2pc提交(官方支持)

(redo日志在prepare阶段就已经sync),绝大部分都比较支持这种说法

http://dev.mysql.com/doc/refman/5.6/en/binary-log.html

http://blog.itpub.net/15480802/viewspace-1411356

http://www.linuxidc.com/Linux/2015-11/124942.htm

http://www.2cto.com/database/201306/221413.html

2pc流程:(sync_binlog = 1,innodb_flush_log_at_trx_commit = 1 )

1.prepare阶段:sync redo 日志(未sync的redo存放于innodb_log_buffer_size中),系统自动完成

获取prepare_commit_mutex(一个全局锁,一次只能被一个事务获取)

2.生成binlog,将binlog写入文件系统(未提交之前binlog存放在binlog_cache_size中),sync binlog,这一步受sync_binlog控制

3.提交commit 将commit标志sync ,释放prepare_commit_mutex(这一步应该受innodb_flush_log_at_trx_commit的控制)

违背了这个参数的定义:innodb_flush_log_at_trx_commit

观点二:redo日志在最后的commit的时候才sync

http://blog.itpub.net/28218939/viewspace-1975809

2pc流程:(官方没有明显的支持这种说法)

1.prepare阶段:获取prepare_commit_mutex

2.生成binlog,将binlog写入文件系统(未提交之前binlog存放在binlog_cache_size中),sync binlog

3.提交commit 将redo log sync ,释放prepare_commit_mutex

这种方式会造成binlog的日志记录多余redo日志记录,在恢复的时候是如何恢复? 难道是以binlog为准,

不管这个事务的redo有没有提交 ,只要写binlog就认为该事务以提交(现阶段还没有找到有关该说法).

innodb数据恢复流程

1.查找未提交的redo日志(找xid)

2.用xid去binlog查找对应的日志记录

3.如果有就认为这个事务是提交的,并补充commit。如果没有就认为是没有提交的,在恢复的时候就rollback事务

###################################################################################################

以上2pc日志写入方式是在 mysql5.6之前的方式,当sync_binlog=1的时候 系统的性能非常糟糕。

从5.6 之后就开始采用BLGC方式写2pc日志,来提升性能

BLGC具体流程如下:(每一个阶段只有一个活跃的线程)

flush stage:搜集多个线程产生的binlog,依次放入flush队列的末尾,

sync stage:flush队列超时(binlog_max_flush_queue_time)或者没有线程产生binlog了 ,flush队列开始sync队列,将binlog写入磁盘(合并io)

commit stage:队列进入提交阶段(这里只做提交操作,redo日志的写入已经在prepare写入)

个人理解:

flush stage:队列中的第一个线程为leader线程,后面的线程为follower线程,leader线程主要负责收集待提交binlog的线程,并且放入

flush 队列的末尾,直到没有找到需要提交binog的线程,或者超时(binlog_max_flush_queue_time),才进入sync stage

sync stage:如果flush stage队列为空,则之前leader线程依然为leader线程,负责binlog的sync,否则变成follower线程(合并执行sync)

commit stage:sync完binlog的线程被放入commit队列的末尾,等待提交

5.7 的组提交:

Step1. InnoDB Prepare,记录当前的LSN到thd中。

Step2. 进入 Group Commit 的flush stage;Leader搜集队列,同时算出队列中最大的LSN。

Step3. 将InnoDB的redo log write/fsync到指定的LSN

Step4. 写Binlog并进行随后的工作(sync Binlog, InnoDB commit

也就是将 redo log的write/sync延迟到了 binlog group commit的 flush stage 之后,sync binlog之前。

通过延迟写redo log的方式,显式的为redo log做了一次组写入(redo log group write),并减少了(redo log) log_sys->mutex的竞争。

组提交

http://www.tuicool.com/articles/rEZr2q

http://mysqllover.com/?p=581

http://www.csdn.net/article/2015-01-16/2823591(淘宝内部mysql交流)

innodb数据丢失的问题:

http://www.360doc.com/content/14/1019/00/12904276_418041635.shtml

组提交的理解:

http://www.bitscn.com/pdb/mysql/201407/226226.html

时间: 2024-10-25 15:09:54

mysql如何保证redolog和binlog的一致性,安全性,效率。的相关文章

MySQL 中Redo与Binlog顺序一致性问题 【转】

首先,我们知道在MySQL中,二进制日志是server层的,主要用来做主从复制和即时点恢复时使用的.而事务日志(redo log)是InnoDB存储引擎层的,用来保证事务安全的.现在我们来讨论一下MySQL主从复制过程中的一些细节问题,有关于主从复制可以看具体的章节. 在了解了以上基础的内容后,我们可以带着以下的几个问题去学习复制到底是怎样工作的. 为什么MySQL有binlog,还有redo log? 事务是如何提交的?事务提交先写binlog还是redo log?如何保证这两部分的日志做到顺

MySQL 中Redo与Binlog顺序一致性问题

首先,我们知道在MySQL中,二进制日志是server层的,主要用来做主从复制和即时点恢复时使用的.而事务日志(redo log)是InnoDB存储引擎层的,用来保证事务安全的.现在我们来讨论一下MySQL主从复制过程中的一些细节问题,有关于主从复制可以看具体的章节. 在了解了以上基础的内容后,我们可以带着以下的几个问题去学习复制到底是怎样工作的. 为什么MySQL有binlog,还有redo log? 事务是如何提交的?事务提交先写binlog还是redo log?如何保证这两部分的日志做到顺

MySQL(一)总体框架 & redo-log 和 bin-log 的介绍

文章部分总结来自课程,非原创 MySQL 组织架构     下面这张图就可以解释关于 MySQL 底层的组织架构了.     上面的图可以直观地展示两个重要的东西 : 一条 SQL 的执行流程 MySQL 的底层架构   大体来说,MySQL可以分为Server层和存储引擎层两部分. Server 层      Server层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期.时间.数学和加密函数等),所有跨存储引擎的功能都在这一层实现

mysql日志redo log 和binlog

在上一篇中我们说到了mysql的基础架构,通常一个查询操作只会涉及到基础架构中的那几部分: 首先连接数据库,分析器进行语义.语法分析,优化器生成执行计划和索引选择.执行器执行对应的语句.存储引擎查看内存中是否有对应的数据,有的话直接返回,没有的话从磁盘查找(不考虑查询缓存):但是对于更新操作的话还需要用到日志来辅助 日志的作用:1.数据恢复需要用到binlog 2.数据库重启后需要redo log来保证数据的可靠,会出现数据还没写入磁盘服务器异常重启的情况 一.redo log(重做log) 由

mysql如何保证数据一致性

1.MySQL数据库层丢数据场景 本节我们主要介绍一下在存储引擎层上是如何会丢数据的. 1.1.InnoDB丢数据 InnoDB支持事务,同Oracle类似,事务提交需要写redo.undo.采用日志先行的策略,将数据的变更在内存中完成,并且将事务记录成redo,顺序的写入redo日志中,即表示该事务已经完成,就可以返回给客户已提交的信息.但是实际上被更改的数据还在内存中,并没有刷新到磁盘,即还没有落地,当达到一定的条件,会触发checkpoint,将内存中的数据(page)合并写入到磁盘,这样

MySQL crash-safe replication(3): MySQL的Crash Safe和Binlog的关系

2016-12-23 17:29 宋利兵 作者:宋利兵 来源:MySQL代码研究(mysqlcode) 0.导读 本文重点介绍了InnoDB的crash safe和binlog之间的关系,以及2阶段提交.组提交等概念.看完后,相信您对MySQL Crash Recovery的过程,以及如何保证Crash Safe会有充分的认识. 本文约2200字,阅读时间约15分钟. 0 - 什么是CrashSafeCrashSafe指MySQL服务器宕机重启后,能够保证:- 所有已经提交的事务的数据仍然存在.

使用MySQL自身复制来恢复binlog

如果需要恢复的二进制日志较多,较复杂,强烈建议使用MySQL自身复制来恢复binlog,而不要使用mysqlbinlog. 目录 [hide] 1. 如何操作 1.1 将binlog作为relay log来执行 1.2 从专门构建的binlog server上拉binlog 2. 其他需要注意的事项 在MySQL手册中一直是推荐使用mysqlbinlog工具来实现指定时间点的数据恢复,事实上,这是一个经常"让人郁闷"的办法.更好的办法是,使用MySQL内部复制线程中的SQL Threa

在MySQL中使用init-connect与binlog来实现用户操作追踪记录

前言:测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化,我们可以在这里获取用户的登录名称和thread的ID值.然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等.实现审计. 1,在mysql服务器db中建立单独的记录访问信息的库set names utf8;create databas

MySQL relaylog + SQL_Thread 增量恢复binlog

一.设置3308实例的已经执行过的gtid号为当天全量备份结束时的gtid号 查看当天xtrabackup全量备份时结束的binlog文件名,binlog的pos 位置点,以及全量备份结束后的Gtid号: [[email protected] backup]# cat /data/backup/db_3306_20190808/xtrabackup_info |grep binlog_pos binlog_pos = filename 'mysql-bin.000003', position '