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版本链有关系
重做日志(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日志之redo log和undo log的知识点有哪些
binlog,redo log,undo log有什么区别吗
原文链接: https://dashen.tech/2022/03/27/MySQL中的log/
版权声明: 转载请注明出处.