废话很少说先来张图解释sql
update T set value = value+1 where ID =2
复制代码
我想可能大部分人看完这图,思考片刻,接下来的就不须要在继续看了,可是考虑到部分朋友仍是新手(包括本身)以及后面复习,仍是稍微唠叨一段。数据库
首先,上图中深色背景的表示在执行器中执行,也就是Server层,浅色的是在InnoDB引擎中执行。
因为不少朋友并非专业的DBA或者对MySQL内部原理并非特别清晰,因此先对redolog和binlog作简单的介绍。bash
redologui
重作日志,属于物理日志,上面存储的是数据库中最终的内容,有固定的大小,能够循环读写,通常设置innodb_flush_log_at_trx_commit为1,表示commit事务时将redolog上面的数据刷入到磁盘(具体的能够自行研究redolog file 和redolog buffer)。具备两个状态分别是prepare和commit,在MySQL重启恢复时会根据commit状态恢复数据。spa
binlog日志
归档日志,属于逻辑日志,上面存储的是最初的修改逻辑能够简单的理解为sql语句,能够追加写,通常设置sync_binlog为1,表示commit事务时将binlog上面的数据刷入到磁盘进行归档。数据恢复和同步都是经过binlog来实现的。code
下面以文字的方式再次描述一下update T set value = value+1 where ID =2的过程。cdn
以上就是比较简单的过程理解,那么为啥要分开写redolog呢?即传说中的两阶段提交?这里再作个简单的分析。
blog
首先对这种方式的好处作个总结:保证以上全部的过程若是出现MySQL实例奔溃都不会致使事务的丢失或异常。事务
接下来分析一下这么作的具体缘由:
redolog只出如今InnDB中,并且是循环写的,不能持久保存,因此暂时不能用redolog来作主从或者数据备份
以上的是总结了不少博客和书上的内容,并非彻底的原创,本身也是在整理,但愿你们能指正不对之处。