MySQL 更新一条数据,redo log 和 binlog 日志流程

 MySQL 更新一条数据的日志流程

MySQL 更新一条数据,redo log 和 binlog 日志流程_第1张图片

 

 用例:将id=1 更新为 id=2

1、更新数据
        1-1、将id=1的信息写入回滚段 undo log 中;
        1-2、undo log在系统表空间或在undo log 表空间,它本身的数据页也在缓冲池中,此时undo log的物理页数据变化也需要写 redo log ,但这不是主流程;
        1-3、将缓冲池中 id=1改为 id=2;
2、将数据页的变化写 redo log 中,redo log根据配置 写:批量顺序写/主动写/被动写 磁盘
3、将数据变化SQL写binlog 日志,写入备库成功通过配置决定,写入:收到数据成功/relay log成功/执行成功;
4、提交事务;

以上是数据更新的粗略步骤。


MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,看看上图的流程,数据是先写redo log 再写 数据页;其实不是这样理解的;写数据页是写内存很快,写redo log 则需要写 redo log buffer 然后需要刷磁盘,redo log写成功了事务才算提交;此时数据页变更了需要异步线程刷新脏页,没刷脏页之前磁盘中的数据还是老版本的数据;这样看来才是 先写 redo log 日志,然后写磁盘;


InnoDB 架构 

MySQL 更新一条数据,redo log 和 binlog 日志流程_第2张图片

你可能感兴趣的:(#,MySQL,mysql优化)