1、MySQL日志系统

redo log(重做日志)

Innodb引擎持有

WAL技术

Write-Ahead Logging,先写日志再写磁盘。当一条记录需要更新时,InnoDB引擎先把记录写到redo log里面,并更新内存,这次更新就算完成了。InnoDB引擎会在适当时候将这个操作记录更新到磁盘。

执行过程

write pos:当前记录位置,一遍写一遍后移。
check point:当前要擦除的位置(更新到磁盘),往后推移。
write pos和check point之间可以用来记录新的操作;当write pos追上check point时,此时不能再执行新的更新;需要等待check point擦除一部分记录再执行更新。
基于redo log,InnoDB可以保证数据库发生异常重启,之前提交的记录都不会丢失,即crash-safe。

binlog日志(server层日志)

redo log与binlog日志不同点

适用范围 记录类型 写入方式
redo log InnoDB引擎特有 物理日志;记录“在某个数据页做了什么修改” 循环写;空间固定会用完
binlog Server层实现,所有引擎都可以使用 逻辑日志;记录语句的原始逻辑 追加写;

Update语句执行过程

mysql> update T set c=c+1 where ID=2;

深色:执行器中执行;浅色:InnoDB中执行
此处将redo log的写入拆分为两个步骤:prepare和commit。——两阶段提交
两阶段提交可以保证redo log和binlog的状态保持逻辑一致。(事务性)——可以保证数据恢复

相关设置

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

MySQL如何判断binlog完整

一个事务的binlog是有完整格式的:

  • statement格式的binlog,最后会有COMMIT;
  • row格式的binlog,最后会有一个XID event。

5.6.2版本以后,引入了binlog-checksum参数,用来验证binlog内容的正确性。

redolog和binlog如何关联

他们有一个共同的数据字段XID。崩溃恢复的时候,会顺序扫描redo log:

  • 如果碰到既有prepare,又有commit的redo log,就直接提交;
  • 如果碰到只有prepare,没有commit的redo log,就拿着XID去binlog找对应的事务。
posted @ 2021-11-06 16:47  kevin_cy  阅读(35)  评论(0编辑  收藏  举报