mysql日志

mysql三大日志

redo log

redo组成:表空间号+数据页号+偏移量+修改数据长度+具体修改的数据

redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎特有。

mysql的数据是以页为单位的,当我们查询数据时是会从硬盘中去加载一页的数据到缓存区,每次查询数据都是先从这个缓存池去找,如果没有再从硬盘中加载。

所以redo log日志记录的是在某个数据页修改了什么,而不是将对修改的整个数据页进行记录,这样大大节省了io开销,提升了性能。

主要作用

​ InnoDB存储引擎特有的一个具有mysql出现宕机服务失效后数据恢复能力的一个重做日志。

刷盘策略

​ 三种策略,默认是提交事务时进行刷盘操作, 这样即使出现服务宕机也不会存在数据丢失的风险。

mysql会开启一个独立的线程每1秒去从redo log buffer中的内容写入到page cache,然后调用fsync函数刷盘到redo log中

image-20230416210705935

存储方式

​ 日志文件组的方式存储,由几个redolog文件"环型"组成,由两个变量writepos和checkpoint控制,前一个当从redo log buffer写入redo log时"指针"往后移,后面就是当mysql从redo log要恢复数据时也是往后移

image-20230416210730433

​ 注意redo log记录的是在某个数据页中修改了什么,相对于对整个数据页进行刷盘操作,redo log节省了IO消耗。

bin log

​ 逻辑日志,记录内容是语句的原始逻辑,不管用什么存储引擎,只要发生了表数据更新,都会产生 binlog 日志。

记录格式

​ 三种格式:statement,row ,mixed,由binlog_format参数指定

​ 其中statement记录的是原语句,但是可能会存在某些函数执行结果不同,例如时间函数等,row记录的是更新的具体数据值,这样就不会出现前面statement格式的问题,但是占用内存过大,所以第三种mixed格式会折中前两种格式,由mysql执行器自行判断。

写入机制

​ 与redo log写入不同的是,它不会开启一个独立线程每1秒从redo log buffer中的内容写入到page cache中,它只是在事务提交后才将bin log cache写入到page cache中,其中bin log cache是mysql为每一个线程独立分配的,注意的是只是将bin log cache写入到page cache中,还没有通过fsync真正写入到磁盘中,所以如果mysql宕机会丢失数据,所以有3种写入策略,只要提交事务就fsync,当提交n件事务就fsync,如果出现宕机损失n个事务的修改的数据。

两阶段提交

​ redo log 是存储引擎innoDB特有的回滚日志,是具有mysql服务器出现宕机失效后恢复数据的能力,而bin log是保证数据一致性的能力,数据备份,主从等问题都离不开bin log,但是由于它们在提交的时机不同,redo log在整个事务开始和结束阶段都会刷盘记录,而bin log则是在事务最后提交的过程中刷盘记录,如果中间出现异常问题则会导致bin log和redo log数据记录不一致的情况,所以引出了两阶段提交。

image-20230416215552232

posted @ 2023-06-06 16:15  stepForward-  阅读(46)  评论(0)    收藏  举报
@format