mysql日志
mysql三大日志
redo log
redo组成:表空间号+数据页号+偏移量+修改数据长度+具体修改的数据
redo log
它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB
存储引擎特有。
mysql的数据是以页为单位的,当我们查询数据时是会从硬盘中去加载一页的数据到缓存区,每次查询数据都是先从这个缓存池去找,如果没有再从硬盘中加载。
所以redo log日志记录的是在某个数据页修改了什么,而不是将对修改的整个数据页进行记录,这样大大节省了io开销,提升了性能。
主要作用
InnoDB存储引擎特有的一个具有mysql出现宕机服务失效后数据恢复能力的一个重做日志。
刷盘策略
三种策略,默认是提交事务时进行刷盘操作, 这样即使出现服务宕机也不会存在数据丢失的风险。
mysql会开启一个独立的线程每1秒去从redo log buffer中的内容写入到page cache,然后调用fsync函数刷盘到redo log中
存储方式
日志文件组的方式存储,由几个redolog文件"环型"组成,由两个变量writepos和checkpoint控制,前一个当从redo log buffer写入redo log时"指针"往后移,后面就是当mysql从redo log要恢复数据时也是往后移
注意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数据记录不一致的情况,所以引出了两阶段提交。
本文作者:sunshineTv
本文链接:https://www.cnblogs.com/sunshineTv/p/17460840.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步