数据库日志(binlog、redo log、undo log)

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区别

binlogredo log
日志归属归属与Server层,所有引擎均可使用仅存在InnoDB引擎中
日志类型逻辑日志,记录原始的sql语句或修改前后的数据物理日志,记录对数据页的修改
写入方式追加写入,一个文件写满后再创建一个新文件写入循环写入,文件全部写满后,从头开始
使用场景主从同步和误删数据的恢复崩溃恢复

undo log

undo log主要用来事务进行回滚时数据的恢复。

当执行增删改操作时,undo log会记录一条相反逻辑的sql日志,因此undo log也是逻辑日志。

等事务需要回滚时,mysql执行undo log中的相反逻辑的sql,达到恢复数据的效果。

事务的四大特性中的原子性,即事务是一个最小的原子单位,不可再分割,要么全部成功,要么全部失败,底层就是使用的undo log,再某一步发送错误时,进行事务回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值