02|日志系统 一条更新语句是如何执行的

与查询流程不一样,更新流程涉及两个重要的日志模块:redo log(重做日志)和binlog(归档日志)


  • redo log

当有一条记录需要更新的时候,InnoDB引擎会先将记录写入redo log里,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个记录更新到磁盘里,这个更新往往是在系统比较空闲的时候做。redo log是有大小限制的,当文件被写满,此时需要先将redo log中的记录部分更新到磁盘,为后续更新操作腾出空间。

  • binlog

是server层维护的一种二进制日志,主要是用来记录对mysql数据更新或潜在发生更新的sql语句,并以“事务”的形式保存在磁盘。主要用于主从复制、数据恢复以及增量备份。

  • 两者区别

1.redo log是InnoDB引擎特有的;binlog是由mysql的server层实现的,所有引擎都可使用。
2.redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,分为两种模式:statement记sql语句,row记录行的更新内容,包括更新前与更新后。
3.redo log是循环写,空间固定大小会用完;binlog是追加写入的,写到一定大小会切换到下一个,不会覆盖以前的日志。

  • 更新语句执行流程图

浅色框表示在InnoDB内部执行,深色框表示在执行器中执行。
在这里插入图片描述
redo log的写入分成了两步:prepare和commit,所谓两阶段提交,用于保证两份日志的一致性。

  • 相关配置

innodb_flush_log_at_trx_commit:设置成1,表示每次事务的redo log都直接持久化到磁盘。建议设为1,保证mysql异常重启之后的数据不丢失
sync_binlog: 设置成1,表示每次事务的binlog都持久化到磁盘。建议设为1,保证异常重启之后binlog不丢失。

猜你喜欢

转载自blog.csdn.net/weixin_43987563/article/details/84850557