mysql--redo log 以及 binlog

1. redo log

简述: 引擎层的redo log 是为了避免每一次更新操作都去查找记录再修改记录(随机读写),采用WAL技术(Write-Ahead Logging写前日志)来转换成顺序读写;

更新数据时,innoDB先把记录写到redo log中,并更新内存,这时便可以返回结果.同时在InnoDB空闲的时候将操作记录更新到磁盘里面.

InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。
mysql--redo log 以及 binlog_第1张图片

write pos 是当前记录的位置,一边写一边后移
checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
write pos 和 checkpoint 之间是可记录空闲空间,当write pos 追上 checkpoint时,需要暂停更新并将数据写入磁盘,然后推进下checkpoint

2. binlog

简述: Server层的binlog记录的是原始逻辑的语句,属于归档日志
binlog有两种模式,记录statement即sql语句,记录row即记录更改前后的两条row记录

3. binlog和redolog的区别

  • redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  • redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。 binlog 文件写到一定大小后会切换到下一个。

4. 两阶段提交

update语句的执行流程图,深色表示server层,浅色表示innoDB层:
mysql--redo log 以及 binlog_第2张图片

5. 参数

innodb_flush_log_at_trx_commit //建议设置成1,每次事务的redolog都会直接持久化到磁盘

sync_binlog //建议设置成1,每次事务的binlog都会持久化到磁盘

6. 常见疑问

1.不能只有redolog或者binlog吗,不是依旧可以还原数据吗?
答:只有redolog情况,redolog是环形的,且容量有限,且redolog是innodb引擎级别的日志
只有binlog, binlog没有被用来做崩溃恢复,一开始就是这么设计的,而且binlog可以被关闭,依靠binlog靠不住

你可能感兴趣的:(mysql)