2.Mysql日志系统
MySQL日志分类(针对InnoDB)
物理日志(引擎层) redo log
逻辑日志(server层) binlog
redo log
当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做
WAL
redo log和磁盘的配合就是WAL技术
WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘(在空闲的时候)
InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,从头开始写,写到末尾就又回到开头循环写
1. checkpoint
当前要擦除的位置
2. write pos
当前记录的位置
crash-safe
有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
binlog
与redo log不同点
1. 拥有对象
redo log是InnoDB引擎特有的;
binlog是MySQL的Server层实现的,所有引擎都可以使用。
2. 记录内容
redo log是物理日志,记录的是“在某个数据页上做了什么修改”;
binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
3. 空间大小
redo log是循环写的,空间固定会用完;
binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。