数据库的三种日志:redo log、binlog和undo log

redo log:记录的是修改后的数据,提供了崩溃恢复的能力

undo log:记录的是修改之前的数据,提供回滚的能力

binlong:记录修改后的数据,用于归档

redo log 重做日志

前置知识:数据库有一个Buffer Pool,Buffer Pool是一块用于存储MySQL磁盘数据的内存空间,将磁盘的IO转换成内存操作,节省了时间,提高效率;如update语句,先更新数据到内存,然后日志写入到redo log,再更新到磁盘,再没更新磁盘时,机器挂掉,则会导致数据丢失;

Q1:redo log是什么?主要存储什么内容?如何存储的?作用是什么?

就是个Mysql的一种日志;当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面

redo log是固定大小的,比如分配4个文件,每个文件1GB;一般从头开始写,写到末尾就又回到开头循环写

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力叫做crash-safe

Q2:redo log时如何实现数据不丢失呢?即如何实现崩溃恢复能力的?

??????待补充

Q3:redo log文件也在磁盘上,数据文件也在磁盘上,都是磁盘操作,何必多此一举?为什么不直接将修改的数据写到数据文件里面去呢?

因为redo log是磁盘顺序写,数据刷盘是磁盘随机写,磁盘的顺序写比随机写高效的多

这种先预写日志后面再将数据刷盘的机制,有一个高大上的专业名词------WAL(Write-ahead logging),翻译成中文就是预写式日志

Q4:如果redo log还没写入磁盘的怎么办呢?

???? 待补充

binlog 归档日志

概述:用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中,默认是二进制格式,无法直接查看;

binlog的作用:

  1. 复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的
  2. 数据恢复:通过mysqlbinlog工具恢复数据
  3. 增量备份

binlog格式
https://zhuanlan.zhihu.com/p/33504555

binlog和redo log的区别?

  1. redo log是InnoDB特有的,binlog是MySQL的Server层实现的,所有引擎都可以使用
  2. redo log是物理日志,记录的是"在某个数据页上做了什么修改";binlog是逻辑日子,记录的是这个语句的原始逻辑,比如"给ID=2这一行的c字段加1" 用一个update的sql举例说明一下?
  3. redo log是循环写的,空间固定且会用完;binlog是可以追加写入的;指binlog文件写到一定大小后会切换到下一个文件,不会覆盖以前的日志

undo log

相关推荐
陌上丨6 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_56786 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw6 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30736 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道7 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据8 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务8 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯9 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七10 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草10 小时前
redis-9-哨兵
数据库·redis·bootstrap