Do not go gentle into that g|

stepForward-

园龄:3年9个月粉丝:5关注:3

📂mysql
🔖mysql
2023-06-06 16:15阅读: 20评论: 0推荐: 0

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

本文作者:sunshineTv

本文链接:https://www.cnblogs.com/sunshineTv/p/17460840.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   stepForward-  阅读(20)  评论(0编辑  收藏  举报
@format
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.