MySQL 脏页与redo日志

本文通过类比图书馆的借阅过程,形象地解释了数据库中脏页和Redo Log的概念及其工作原理。脏页是指内存中已修改但未同步到磁盘的数据页;Redo Log则用于暂存待同步的脏页,以提高写操作效率。

首先说一下什么叫脏页,就是内存中的数据对应硬盘的数据有所改变.改变后的数据页就叫做脏页.

它形成的前后关系以及讲解可以看:

http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/comment-page-1/


上面的博文比较学院化,老子不喜欢,但是讲的很好.我要用我自己的语言重新解释.


这个世界是不安全的,盗取无处不在.

有一家图书馆,每天都有借出去的书,也有还回来的书,书架上都有标签,还书后还要放回原标签处.

某天小姐来借书,借走了"男性生理结构这本书".那么这个书所在的位置就空出来了.这种需要被放回去的书我们称之为脏页.

小姐研读完毕,回到图书馆说,我看完了,退书.但是她并不是在哪里拿,在哪里退,而是送回给图书管理员.

图书管理员将被还回来的书放到了一个安全的所在,一排排的整理好.

最后,等到一天结束或者书量巨大,就将抽出时间将这些书整批整批的放回远处.


redo log 和 刷脏页大致的流程就是如此,书就是数据页,被借出的书就是脏页,将来要被放回的.redo 日志就是暂时存放要被放回的书的地方,因为这样会比较快,如果

还回一本书放回去一本,就会导致很多的随机写入,而且写入次数十分大.

redo log 大小:innodb_log_file_size*innodb_log_files_in_group

脏页大小:current LSN - check point LSN

脏页最大量:innodb_max_dirty_pages_pct (计算方法:脏页大小/redo log 大小)


就是这样,将来还会继续更新与redo log 和脏页之间的现象.

### Mysql中binlog、undologredolog日志功能及区别 #### binlog(二进制日志) binlogMySQL Server 层的日志,记录了数据库的逻辑操作,例如 `INSERT`、`UPDATE` 和 `DELETE` 等语句。它以逻辑日志的形式存储,记录的是 SQL 语句的原始逻辑[^1]。 - **功能**: - 主要用于主从复制,从库通过读取主库的 binlog 来实现数据同步[^2]。 - 可用于数据恢复,当数据库发生故障时,可以通过重放 binlog 来恢复数据[^4]。 - **刷盘时机**: - `sync_binlog` 参数控制 binlog 的刷盘行为,建议设置为 1,即每次事务提交时都将 binlog 写入磁盘,以保证异常重启后日志不会丢失[^4]。 - **格式**: - 支持三种格式:`STATEMENT`、`ROW` 和 `MIXED`。`ROW` 格式记录每一行的变化,而 `STATEMENT` 格式记录执行的 SQL 语句。 --- #### redo log(重做日志redo log 是 InnoDB 存储引擎层的日志,记录了数据的物理变化,属于物理日志[^3]。 - **功能**: - 主要用于崩溃恢复。当数据库因意外宕机或介质故障而需要恢复时,redo log 能够确保未写入磁盘的数据能够被重新应用,从而保证数据的一致性和完整性。 - **记录形式**: - 记录的是数据的物理变化,而非具体的 SQL 操作。例如,某一行数据从 A 值更新为 B 值,redo log 会记录这一变化的详细信息[^2]。 - **写入方式**: - redo log 是循环写入的,其日志空间大小是固定的。当一个日志文件写满后,会切换到下一个日志文件,形成循环使用。 --- #### undo log(回滚日志) undo log 同样是 InnoDB 存储引擎层的日志,主要用于事务的回滚以及多版本并发控制(MVCC)。 - **功能**: - 在事务执行过程中,如果需要回滚,undo log 提供了撤销操作的能力。例如,某条记录被更新后,undo log 会保存该记录的旧版本,以便在需要时恢复旧值[^2]。 - 支持 MVCC,允许多个事务同时读取不同版本的数据,而不会相互干扰[^1]。 - **记录形式**: - 记录的是事务执行前的数据状态, redo log 不同,undo log 是逻辑日志[^2]。 --- #### 区别总结 | 日志类型 | 层级 | 功能 | 记录形式 | 使用场景 | |------------|--------------|--------------------------|----------------|------------------------------------| | binlog | MySQL Server | 数据恢复、主从复制 | 逻辑日志 | 数据同步、故障恢复 | | redo log | InnoDB 引擎 | 崩溃恢复 | 物理日志 | 数据库异常宕机后的数据一致性恢复 | | undo log | InnoDB 引擎 | 事务回滚、MVCC | 逻辑日志 | 回滚操作、支持并发读 | --- ### 示例代码:查看 binlog 文件内容 ```bash # 查看当前 binlog 文件列表 SHOW MASTER LOGS; # 查看指定 binlog 文件的内容 mysqlbinlog /var/lib/mysql/binlog.000001; ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值