Redo日志--mysql详解(九)
篇文章说了,刷新数据是通过页为单位,不可能每次查询都从磁盘查询,于是有了buffer pool,通过free,flush来刷新到磁盘,系统正常关闭,系统空闲,内存不足时候刷新。lru链表为了提高缓存命中率来刷新页到磁盘。后面介绍了acid,原子性代表在一个事务里要么全部成功要么全部失败,一致性官方文档解释是除了数据库的主键唯一建等约束外,还有业务的约束保证一直性,新增和扣减必须一致。
Redo日志
我们为了保证持久化,每次都需要把数据刷新到磁盘上,但我们是根据页来刷新的,并且修改一条sql语句可能包含很多页,但每个页值修改一个字节,很少的数据,这时候总不能直接持久化,但如果系统宕机了,数据没有持久化就会丢失,于是,redo日志就出现了(重做日志)。
Redo日志有两个特点,占用非常小,并且顺序写入磁盘(页的存放是随机I/O)。
所以redo日志大致就是type,space id表空间id,page numer页号,data 日志具体内容。
前面说过当表没有主键或者唯一建,这时候会给一个隐藏的row_id,有个max_row_id是一个全局变量,每次插入会自增1。
我们在执行一条修改语句会修改很多数据,比如索引的几棵b+树,树上的内节点和叶子节点等,也可能创建新页面。
Redo日志有日志缓冲区,类似于buffer pool,会申请redo log buffer连续内存,默认16mb。
这个缓冲区是干嘛的呢,前面我们说了真实刷新数据是在buffer pool里面,但是在存储之前会记录数据到redo log日志上,redo log有点就是占用小,并且顺序I/O,变相来说,redo log实现了从随机I/O变成了顺序I/O,当然buffer pool本身是刷数据还是随机I/O。
Log sequence number:系统运行会不断修改页面生成redo日志,当前默认值是8704,随着redo日志越来越多而升高。Redo日志每条数据都有唯一lsn值,lsn值越小,则代表越早生成。
如何查看系统中的各种lsn值呢,通过show engine innodb。
相关文章
- 跨脚本步骤 复杂 SQL血缘识别
- MySQL 在 Windows 系统下的安装
- MYSQL安装报错解决方法
- Docker部署mysql并提供客户端访问
- 哪些因素会导致 MySQL 慢查询
- 如何正确理解 RT 并监控 MySQL 的响应时间
- SQL语句练习04
- docker高级篇1-dockeran安装mysql主从复制
- 3种方法为你的稀有物种建立生物学知识数据库
- 把MsigDB数据库的全部通路转为gsva分析要求的输入格式
- 【mysql】Could not create connection to database server. Attempted reconnect 3 times. Giving up.
- Archery – SQL审核查询平台
- chatGPT实战之「基于你的数据库,为你智能生成SQL」
- 【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?)
- 小技巧 EntityFrameworkCore 实现 CodeFirst 通过模型生成数据库表时自动携带模型及字段注释信息
- Flink SQL 知其所以然(二十八):Window TopN 操作
- Flink SQL 知其所以然(二十九):Deduplication去重 & 获取最新状态操作
- Flink SQL 知其所以然(三十):Explain、Show、Load、Set 子句
- 【愚公系列】2022年12月 Elasticsearch数据库-ELK添加中文分词器插件(三)
- MySQL 中基于 XA 实现的分布式事务