一 简介: 今天是第二篇,讲解的是mysql的事务日志

二 具体

1 WAL技术(先写日志,再写磁盘)

2 binlog redolog 二阶段提交协议
     目的 保持 redo log和binlog之间的逻辑一致,这样采用binlog方式就能恢复数据
     第一阶段先写redo log,处于prepare状态
    1 redo log记录的是物理日志,数据页的具体修改操作
    2 控制参数与原理

原理系列 1 mysql写日志过程 log_buff ---mysql写 (write)---> log_file---OS刷新 (flush)---> disk

2 mysql内部进行主动sync的函数是 log_buffer_flush_to_disk

控制参数 
    innodb_flush_log_at_trx_commit=1 控制redo log缓存的刷新方式
     0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
           当mysql崩溃时可能会丢失上1S事务 此时不调用 log_buffer_flush_to_disk
    1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
          当mysql崩溃或者系统崩溃时,最多丢失1个事务 此时调用 log_buffer_flush_to_disk,不依赖linux本身的 sync函数
    2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
         当linux系统崩溃时,上1S事务才可能丢失 此时不调用log_buffer_flush_to_disk

总结 我们可以发现,从事务提交是否触发相应write and sync 角度来进行控制redo log到磁盘过程的控制
   3 顺序写入
   4 redo log根据checkpoint来控制是否可以覆盖,checkpoint之前的区域都是可以覆盖的,之后的不行,必须得应用完成才能覆盖

5 实现了组提交技术

6 redo记录的是数据页改变,那么如何保证数据页的完整性呢,要依靠数据库的双写特性,值的主要的是,如果硬盘本身支持16K原子写,就可以关闭双写服务
   第二阶段再写binlog,处于commit状态
  1 binlog记录的是逻辑日志,row格式下具体记录(DML影响的具体数据,DDL具体的执行语句)
  2 控制参数
  sycn_log=1 控制binlog的刷新方式,1值代表当有1个事务提交时,刷新缓存到文件中
  3 顺序写入

4 实现了组提交技术
三 总结
1 只有当两阶段完成后才代表整个事务完成,当发生故障时,两阶段完成的事务会重做,没有两阶段完成的事务会回滚
2 innodb_flush_log_at_trx_commit and sycn_log 对mysql数据库tps的性能影响非常大,重要环节推荐设置双1

四 二阶段提交协议与 故障恢复

1. 准备阶段(Storage Engine(InnoDB) Transaction Prepare Phase)

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

2. 提交阶段(Storage Engine(InnoDB)Commit Phase)

2.1 记录协调者日志,即Binlog日志。

如果事务涉及的所有存储引擎的prepare都执行成功,则调用TC_LOG_BINLOG::log_xid方法将SQL语句写到binlog(write()将binary log内存日志数据写入文件系统缓存,fsync()将binary log文件系统缓存日志数据永久写入磁盘)。此时,事务已经铁定要提交了。否则,调用ha_rollback_trans方法回滚事务,而SQL语句实际上也不会写到binlog。

2.2 告诉引擎做commit。

最后,调用引擎的commit完成事务的提交。会清除undo信息,将 xid写入redo日志中 将事务设为TRX_NOT_STARTED状态。

3 MySQL内部两阶段提交需要开启innodb_support_xa=true,默认开启。这个参数就是支持分布式事务两段式事务提交。redo和binlog数据一致性就是靠这个两段式提交来完成的,如果关闭会造成事务数据的丢失,XID正是由于XA事物生成

当崩溃恢复时
1 如果redo log里的事务是完整的(prepare+commit),则进行提交
2 如果redo log里的事务是不完整的(只有prepare状态),通过获取redo的prepare事务列表和最后一个binlog文件的xid事务列表进行结合
   1 binlog事务完整 进行事务提交
   2 binlog不完整 进行回滚
备注
1 binlog通过checksum和XID进行判断事务是否完整
2 redo log和binlog之间是通过事务XID进行关联的

目的 1 保证主从数据库的一致性,当主库binlog落盘时,才传递到从库上

mysql 原理 ~ 二阶段提交协议通说的更多相关文章

  1. mysql 原理 ~ 索引通说

    简介: 来说说索引吧目的:为了加快数据库的数据查找速度,索引应用而生基础知识基本定义  1 遍历 所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次 ...

  2. Mysql原理与优化

    原文:https://mp.weixin.qq.com/s__biz=MzI4NTA1MDEwNg==&mid=2650763421&idx=1&sn=2515421f09c1 ...

  3. Oracle数据库,忽略大小写Like模糊查询(SQL Server,MySql原理相同)

    背景 在使用Oracle或者其它数据库时,使用like 关键字进行模糊查询是大家经常使用的功能,在纯中文环境中使用非常好用,还有一些通配符可以使用,但是在纯英文环境中,会出现大小需要精确匹配的问题,主 ...

  4. mysql原理以及相关优化

    说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在 ...

  5. Mysql 原理以及常见mysql 索引等

    ## 主键 超键 候选键 外键 (mysql数据库常见面试题) 数据库之互联网常用架构方案 数据库之互联网常用分库分表方案 分布式事务一致性解决方案 MySQL Explain详解 ## 数据库事务的 ...

  6. 要了解mysql原理,还是要心里有点B树才行

      要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树,最后到B+树来一步一步了解数据库索引底层的原理! ...

  7. 【MySQL 原理分析】之 Trace 分析 order by 的索引原理

    一.背景 昨天早上,交流群有一位同学提出了一个问题.看下图: 我不是大佬,而且当时我自己的想法也只是猜测,所以并没有回复那位同学,只是接下来自己做了一个测试验证一下. 他只简单了说了一句话,就是同样的 ...

  8. MySQL原理

    MySQL基础: sql语句的执行过程: 连接器:登录连接sql数据库 分析器:分析解读sql语句,并检查是否符合SQL语法规则 优化器:对实现方式进行优化,比如在查询时决定使用哪个索引. 执行器:执 ...

  9. mysql 原理 ~ redo

    一 简介:redo log二 文件   ib_logfile0 ib_logfile1 两个redo log 默认为一组 循环覆盖写入三 相关参数   innodb_log_file_size=256 ...

随机推荐

  1. Wordpress 之删除 RSS 功能 的"文章RSS"、"评论RSS"、"WordPress.org"

    一. 去除底部“自豪地采用 WordPress”版权信息: 1.打开主题文件夹:wp-content/themes/twentyeleven/footer.php; 2.找到 这段代码 删除即可: & ...

  2. 自学Linux Shell15.2-作业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)

    点击返回 自学Linux命令行与Shell脚本之路 15.1-作业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab) 1  控制作业 1.1查看作业 (jobs ...

  3. 【CF809E】Surprise me!(动态规划,虚树,莫比乌斯反演)

    [CF809E]Surprise me!(动态规划,虚树,莫比乌斯反演) 题面 洛谷 CodeForces 翻译: 给定一棵\(n\)个节点的树,每个点有一个权值\(a[i]\),保证\(a[i]\) ...

  4. emwin之在WM_INIT_DIALOG分支下使用带触发功能的函数的程序框架

    @2018-08-29 [小记] 为避免在窗口创建时由于使用了带触发功能的函数导致执行一些在初始化过程中不允许的操作,特整理一个流程架构 --① 定义一个初始化完成的标志 unsigned ; --② ...

  5. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  6. CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

    CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 好像这个题只能Dsu On Tree? 有根树点分治 统计子树过x的 ...

  7. 51nod1238 最小公倍数之和 V3

    又被这神仙题给坑爆了. 神仙题解. 一开始我把lcm变成ij/gcd然后按照常规套路去推,推到最后发现不是miu * Id而是miu · Id......这还搞鬼啊. 正解居然跟这个差不多,先转成求其 ...

  8. A1051. Pop Sequence

    Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...

  9. qbxt的题:找一个三元环

    有向图中找一个三元环 题意: 考虑 N 个人玩一个游戏, 任意两个人之间进行一场游戏 (共 N*(N-1)/2 场),且每场一定能分出胜负.现在,你需要在其中找到三个人构成的这样的局面:A战胜B,B战 ...

  10. Linux下编译安装Lnmp

    1.安装nginx 下载链接http://nginx.org/en/download.html (1)下载,解压 wget http://nginx.org/download/nginx-1.15.8 ...