美文网首页
MySql的日志系统:redo log和binlog

MySql的日志系统:redo log和binlog

作者: 等你足够强了再说吧 | 来源:发表于2021-03-30 16:48 被阅读0次

    一条语句在MySql中的执行流程是这样的:MysqlSql客户端通过Tcp连接向MySql服务器发起请求,MySql Server依次经过连接器、分析器、优化器、执行器,然后根据需求读写存储引擎,譬如InnoDB。 如下图所示:


    image.png

    现在InnoDB引擎的流行与其支持的事务特性密不可分。要想crash-safe就离不开redo log和binlog的紧密配合。
    binlog是MySql server层的日志,用来归档的。MySQL的主从同步就是基于binlog的。让MySql从众多RDB中脱颖而出,与MySQL原生支持主从同步密不可分。
    redo log是InnoDB引擎特有的。用来实现 crash-safe。
    一个update操作,譬如 update log set password='CimageView2' where id =1,在日志系统中是这样流转的:

    1. MySql Server层的执行器调用InnoDB引擎的写接口,传入此次变更。
    2. InnoDB引擎在写入redo log后,更新内存。此时redo log中将这条变更标记为preare状态。这个时候,更新操作就算是完成了。InnoDB引擎会在合适的时机将这个更新操作更新到磁盘。
    3. 执行器收到InnoDB引擎的成功回复,知道更新已经成功,在任何时间提交事务,更新操作的全部成功了
    4. 执行器将这条变更的原始语句写入binlog。
    5. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
    6. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

    binlog和redo log:
    区别1:
    redo log 是 InnoDB 引擎特有的;
    binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
    区别2:记录数据格式上
    redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
    binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 id=1这一行的 password 字段更改为CimageView2”。
    区别3:写入方式上
    redo log 是循环写的,空间固定会用完;
    binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

    相关文章

      网友评论

          本文标题:MySql的日志系统:redo log和binlog

          本文链接:https://www.haomeiwen.com/subject/xpcghltx.html