面试必会:聊聊Mysql的binlog、relog、unlog?

本文900字,内容经过多篇作者的提炼,用做简短干练的话让你瞬间读懂理解


一、redo log :重做日志

  作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性特性。

  内容:物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

特点:mysql,如果每次更新操作都要写进磁盘,然后磁盘要找到对应记录,然后再更细,整个过程io成本、查找成本都很高。

解决方案:WAL技术(Write-Ahead Logging)。先写日志,再写磁盘。

二、bin log :归档日志(二进制日志

  作用:用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。用于数据库的基于时间点的还原。

  内容:逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

  binlog 有三种模式:Statement(基于 SQL 语句的复制)、Row(基于行的复制) 以及 Mixed(混合模式)

三、undo log : 回滚日志

  作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)即非锁定读

  内容:逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。数据库事务四大特性中有一个是原子性,原子性底层就是通过undo log实现的。

时机不同:

redo log在事务执行过程中可以不断写入。

binlog只有在提交事务时才写入。

所以redo log与binlog的写入时机不一样。会导致问题么?

开始事务 
更新数据 -----> 写入redo log(prepare阶段) 
提交事务 -----> 1.写binlog , 2.写入redo log(commit阶段)



四、Mysql 支持binlog订阅 怎么实现?

看下业界常规实现如下:

mysql-binlog -> 通过canal增量订阅 -> 发送到kafka(binlog json) - flink数据转换/分发(UMS格式)

原理:

canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议 mysql master收到dump请求,开始推送binary log给slave(也就是canal) canal解析binary log对象(原始为byte流)。

展开阅读全文

页面更新:2024-04-16

标签:磁盘   语句   逻辑   物理   阶段   事务   格式   内容   数据   日志

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top