Mysql的日志模块尤为重要,平日的crash-safe和主从都依赖我们的日志模块。
Mysql innoDB日志
Mysql innoDB有两个日志模块:redolog 和 binlog
咱们先看一下redolog。
redolog中文来讲就是重做日志,它有什么用呢?如果每次你的更新或者插入都写入磁盘的话那这个IO成本就比较大了,所以InnoDB就把记录先记录在redolog中,并同时更新到内存中,这样就完成了一次更新或插入了!
而且redolog是循环写的,也就是有固定大小的,当快写满的时候mysql就会把把一些记录更新到磁盘中,然后清除更新的那些redolog,给之后的记录腾出空间。
binlog也就是归档日志,它又是什么用呢?顾名思义它的主要作用就是归档(还有主从)!有三种模式:
statement:记录每一条除了查询之外语句。
row:记录每一行记录修改的形式,也就是记录了哪一行改了,改了啥!就比如你update了100条记录,那它就会记录这100条记录改了啥(5.1.5版本才有)
mixed:就是statement和row的混合了,由mysql来判断这条语句用哪种形式记录!(5.1.8版本才有)
binlog没有固定大小,每次都是追加记录不会覆盖之前的。
还有一点,redolog只有InnoDB才有,它是存在引擎层的,而binlog是存在Server层的。所以如果你用的存储引擎的MyISAM,那么你就没有redolog了!
两段式提交
接下来我们再说说两段式提交。
两段式提交,就是我们先把这次更新写入到redolog中,并设redolog为prepare状态,然后再写入binlog,写完binlog之后再提交事务,并设redolog为commit状态。也就是把relolog拆成了prepare和commit两段!
为啥要这样做?
其实redolog是后来才加上的,binlog是之前就有的。一开始存储引擎只有MyISAM,后来才有的InnoDB,然后MyISAM没有事务,没有crash-safe的能力。所以InnoDB搞了个redolog。然后为了保证两份日志同步,所以才有了两段式提交。
你假设一下如果先保存好redolog,然后再记录binlog。如果redolog写好了之后挂了。ok你看起来好像是没问题了,但是你的binlog还没记录,所以这条记录就少了!如果你备份这份binlog之后,你这条记录就永远的少了!
那如果先写binlog再写redolog呢?那binlog写完了,你数据库挂了,那redolog是不是没有,没有的意思就是你以前你没更新成功。但是binlog已经记录好了,在它那边反正是成功了,所以那备份的binlog也不对!