less than 1 minute read

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

回滚日志,保证事务原子性。

Tags:

Categories:

Updated: