binlog
又称归档日志,由Server层实现与记录,因此对任何引擎都有效。
binlog是一种记录对表数据进行增删改操作以及表结构改变的二进制文件。update、delete、insert、create table等等语句都会被记录,binlog记录的是sql语句,属于逻辑日志。
并且binlog是追击写入的,即写满一个文件后,会再创建一个文件接着写入,文件名称是mysql-bin.xxxxxx,如mysql-bin.000001,序号递增。
binlog格式
binlog有三种日志,并通过binlog-format来设定。
STATEMENT
直接记录对应操作的sql语句。
优点:
可读性强,不记录具体的数据,日志量不大,节省空间。
缺点:
当binlog用于主从之间的复制时,如果当前的sql语句为随机函数rand()、当前日期now()等,在重现之后具有不同的值,具有歧义性,可能会造成复制后数据不一致。
ROW
对于更新操作,会记录更新操作前后的具体数据,如update stu set name ='李华' where id=1;
会记录id=1更新前后的name字段。
优点:
记录信息完整准确。
缺点:
可读性比较差,需要经过解析;随着数据增多,日志量会显著增多,性能较差;
MAXED
STATEMENT和ROW格式的混合使用,没有歧义的操作使用STATEMENT格式记录日志,对表结构的修改操作使用ROW格式。
binlog使用场景
1.主从复制
当使用mysql的主从结构时,主库负责写操作,从库负责读操作,从库需要同步主库数据。
当同步数据时,主库会将自己binlog异步发送给从库,从库本地接收,来达到主从数据一致的目的。
不过,主从复制有延迟,写完主库之后立马读取从库,可能会出现问题。
2.数据恢复
当误删了数据库的数据时,先找到最近的一次全量备份,恢复到临时库中,接着从从全量备份的时间点上,重放binlog恢复记录,直到binlog不再产生日志。
binlog默认不开启
redo log
redo log又称重做日志,只存在与InnoDB引擎中,和binlog不同,记录在某个数据页上做了哪些修改,属于物理日志。
redo log有什么用?
在InnoDB引擎中,是以页为单位来和磁盘进行交互的,当一个事务提交后,需要将修改的数据页写回到磁盘。
如果数据页就涉及到几个字节的修改,直接将当前数据页刷新到磁盘,会有大量的随机写,IO成本很大,很消耗性能。
如果事务提交后,先将对哪个数据页进行修改顺序写入redo log,之后再写回到buffer pool缓冲池中,最后将buffer pool的数据页刷新到磁盘,可以一定程度减少IO成本。
而且,binlog是不支持崩溃后恢复的,当binlog和redo log结合后,数据库崩溃后,redo log较数据页多出来的日志记录,就是崩溃后需要恢复的数据。
redo log记录方式
与binlog的追加写入不同,redo log是用循环写入的,用循环写入是因为之前恢复的数据没有用了,可以删除覆盖。
假如redo log有四个文件,当全部写满后,就会重新从第一个文件写入。
redo log还涉及到两个指针--write position和check point
write position
指向redo log记录进度,指针走过的区域,日志记录不断增加。
check point
指向数据页刷盘后的恢复记录,check point走过的区域,redo log会刷盘,然后删除。
两个指针的运动方向,都是顺时针方向。
因此,从write position顺时针到check point之间的区域,都是空着的部分。
当redo log记录过快时,write position可能会追赶上check point。此时就需要停止redo log记录,并将所有文件中的redo log恢复。
binlog和redo log区别
binlog | redo log | |
日志归属 | 归属与Server层,所有引擎均可使用 | 仅存在InnoDB引擎中 |
日志类型 | 逻辑日志,记录原始的sql语句或修改前后的数据 | 物理日志,记录对数据页的修改 |
写入方式 | 追加写入,一个文件写满后再创建一个新文件写入 | 循环写入,文件全部写满后,从头开始 |
使用场景 | 主从同步和误删数据的恢复 | 崩溃恢复 |
undo log
undo log主要用来事务进行回滚时数据的恢复。
当执行增删改操作时,undo log会记录一条相反逻辑的sql日志,因此undo log也是逻辑日志。
等事务需要回滚时,mysql执行undo log中的相反逻辑的sql,达到恢复数据的效果。
事务的四大特性中的原子性,即事务是一个最小的原子单位,不可再分割,要么全部成功,要么全部失败,底层就是使用的undo log,再某一步发送错误时,进行事务回滚。