MySQL三大日志简介
MySQL日志有很多,其中比较重要的有bin log、redo log、undo log
redo log
重做日志,让MySQL拥有了崩溃恢复能力。当MySQL宕机了,重启时,InnoDB会使用redo log恢复数据,保证数据持久性与完整性。
MySQL中数据是以页为单位存储的,当查询一条记录时,会从硬盘里把数据所在的页加载出来,放入Buffer pool中。
后续查询就可以直接从Buffer pool中找,没有的时候再去硬盘加载,减少了硬盘IO,提升了性能。
更新表数据的时候,也是如此,如果可以直接在Buffer pool里修改,那就直接修改,然后会把做修改的操作记录到redo log buffer里,刷盘的时候写入redo log
刷盘时机
可见刷盘时机很重要,InnoDB提供了三种刷盘策略。InnoDB存储引擎有一个后台线程,每隔1秒就会把redo log buffer中的内容写到page cache,然后调用fsync刷盘
每次事务提交时不进行刷盘操作
事务提交时不刷盘,有个后台线程每1秒轮询刷盘,所以有可能损失1秒内的数据。
每次事务提交时都进行刷盘操作(默认)
提交事务就刷盘,保证了事务的持久性
每次事务提交时都只把redo log buffer写入page cache(文件系统缓存)
日志文件组
redo log不只一个文件
小结
为什么修改数据要先修改buffer pool,然后在redo log中记录,能否直接修改硬盘?
因为修改的数据量远远小于数据页的大小,采用redo log的形式保证了数据库的性能。
bin log
bin log记录在某个数据页上的修改。MySQL数据库依赖bin log来同步数据,保证数据一致性。
记录格式
bin log日志有三种格式
- statement
- row
- mixed
写入机制
事务执行过程中,把日志写入bin log cache,事务提交的时候,再把bin log cache写到bin log中。
undo log
回滚日志,保证事务原子性。