MySQL中的log

https://www.bilibili.com/video/BV1U14y1d79M

https://xiaogenban1993.github.io/23.04/mysql_%E4%BB%8E%E5%A4%B4%E5%88%B0%E5%B0%BE%E7%9A%84mysql.html

bin log是mysql级别的, redo log与undo log是Innodb存储引擎级别的,其他的存储引擎没有

bin log是记录执行的写操作

在my.ini中将log-bin=mysql-bin这行取消注释

执行写操作后,通过 show binlog events;可以看到

直接打开mysql-bin.000001会是乱码,需要先转换一下:

mysqlbinlog --no-defaults mysql/data/mysql-bin.000001 > output.sql

再打开就正常了


binlog有三种模式:

  • STATEMENT(最常见的)

  • ROW(记录行)

  • MIXED (两者结合)

MySQL其实每个sql,都默认前面有个begin,后面有个commit。


redo log也是用来记录执行的数据变动(innodb存储引擎级别),存储的是数据页的变动。顺序写,性能更好。

redolog vs binlog

binlog是逻辑日志,记写操作的sql;redolog是数据页的变动情况,物理日志,记录的是一些二进制数据;binlog会不断累积,redolog会循环利用文件组覆盖

binlog的目的是记录所有的写sql,用于归档,可以恢复到任意时间,redolog的目的是故障恢复,所以只需要保证记录了所有脏页即可。

update数据的过程是,读取出要改的数据页,扔到上文提到的BufferPool中,然后对页进行更改,当事务提交后,对应的缓冲页会扔到flush链,我们上文说系统会定期刷新flush链的内容。不过漏掉了细节,就是对页进行更改后,需要将更改的内容以redolog的形式进行持久化。redolog的生成过程,也需要现将生成的内容以redo log block的形式放到LogBuffer中,然后等LogBuffer刷盘,有两个时机是必须刷盘的:

写ibd是随机写,很慢。写redo log是顺序写,很快

redolog是个环,占用空间的上限是固定的,不会像binlog可能无尽增长


undo log不是真的log,更像是数据页,最终会写到idb文件里。。

与事务回滚和mvcc版本链有关系


02.日志系统:一条SQL更新语句是如何执行的?

第十七篇:MySQL 日志管理

重做日志(redo log)

回滚日志(undo log)

二进制日志(binlog)

错误日志(error log)

慢查询日志(slow query log)

一般查询日志(general log)

中继日志(relay log)

MySQL进行主主复制或主从复制的时产生的日志。


redo log和bin log的区别:

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

MySQL日志分类讲解

MySQL中的日志文件 你全都了解吗?

MySQL日志之redo log和undo log的知识点有哪些


MySQL架构和事务日志


binlog,redo log,undo log有什么区别吗

5分钟精通数据库Undo Log原理-事务的原子性

【大厂文章速读】阿里-庖丁解InnoDB之REDO LOG