mysql redo undo binlog
所属分类 mysql
浏览量 991
redo log 重做日志
undo log 回滚日志
binlog 二进制日志
redo log 物理日志,undo log 和 binlog 是逻辑日志
binlog server层记录 无论用什么引擎,都会记录,用于主从复制,恢复等
redo log InnoDB存储引擎层,保证事务安全 持久性
undo log 保存事务发生之前的数据,用于回滚,提供多版本并发控制下的读(MVCC),即非锁定读
crash-safe
InnoDB 保证数据库发生异常重启,之前提交的记录不丢失
redo log 物理日志,记录数据页修改 ,顺序写磁盘
事务开始之后,开始产生 redo log ,事务执行过程中,redo log 逐步落盘
当对应事务的脏页写入到磁盘之后,redo log 的使命就完成了,占用的空间可以被覆盖
InnoDB 的 redo log 固定大小,比如可以配置为一组 4 个文件,每个文件大小 1GB
从头开始写,写到末尾后回到开头循环写
redo log 包括两部分
一是内存中的日志缓冲(redo log buffer)
二是磁盘上的重做日志文件(redo log file),该部分日志是持久的
落盘方式(将 innodb 日志缓冲区的日志刷新到磁盘)
Master Thread 每秒一次执行刷新 Innodb_log_buffer 到重做日志文件
每个事务提交时会将重做日志刷新到重做日志文件
当重做日志缓存可用空间少于一半时,重做日志缓存被刷新到重做日志文件
undo log (回滚日志)
保存了事务发生之前的数据的一个版本
用途
用于回滚
提供多版本并发控制下的读(MVCC),非锁定读
事务开始之前,将当前事务版本生成 undo log
事务提交之后,undo log 并不能立马删除,而是放入待清理的链表
由 purge 线程判断是否可以清理 undo log 的日志空间
undo log 逻辑日志,保存事务发生之前上一个版本的数据,可以用于回滚
当事务需要读取老版本的数据,可顺着 undo 链找到满足其可见性的记录
默认 undo 保存在共享表空间
MySQL5.7 之后 支持独立 undo 表空间
binlog 二进制日志
可以简单理解为 存储着每条变更的SQL语句
可以用于恢复
可用于主从复制中,从库利用主库上的 binlog 进行重放,实现主从同步
用于基于时间点、位点等的还原操作
binlog 模式分三种 Statement Row Mixed
statement
记录执行语句
不需要记录每一行数据的变化
存储过程中使用 last_insert_id() 函数,可能会使 slave 和 master 上得到不一致的 id
兼容问题
row 模式
记录每一行数据的变化
可能会产生大量的日志
Mixed 模式
之前的 MySQL 一直都只有基于 statement 的复制模式,直到 5.1.5 版本的 MySQL 才开始支持 row 复制
从 5.0 开始,MySQL 的复制已经解决了大量老版本中出现的无法正确复制的问题
但是由于存储过程的出现,给 MySQL Replication 又带来了更大的新挑战
事务提交的时候,一次性将事务中的 sql 语句 按照一定的格式记录到 binlog 中
一个事务可能包含多个 sql 语句
默认保存时间 expire_logs_days
mysql各种日志文件介绍
上一篇
下一篇
甜歌系列
mysql的读已提交和可重复读
springboot基础配置
tomcat8 嵌入式 servlet 实例
tomcat8 连接器
Tomcat NIO 处理机制