MySQL 的数据以数据页为单位,按偏移量寻找记录的具体位置,所以每次IO操作都是一个个数据页加载到内存。 但是我们需要查询或修改的数据也许就是一条记录,甚至对于更新操作,又会将数据页整个的刷新到磁盘,所以IO成本非常高,因而为了降低 IO 操作的成本,MySQL 做了大量的努力。
更新操作牵涉两个重要的日志:redo log 和 binlog
redo log 怎么起作用的
redo log 可以简单分为两个部分
- 内存层面的 redo log buffer
- 持久化层面的 redo log file
redo log实现的具体逻辑:
write pos 和 check point
write pos 是 redo log 追加日志的索引,check point 代表擦除记录的位置,write pos 代表当前写的位置,当 write pos = check point 时,代表剩余空间已经被写完了,需要将 write pos 向前推进,擦除 redo log 中的一部分,并将这部分操作刷新到磁盘中,这样就形成了一个循环队列的数据结构,具体的形象图如下:
binlog和redo log的区别
- redo log 是 InnoDB 独有的,而 binlog 是 server 层的,所有的引擎都可以使用
- 在更新事务期间,redo log 会循环不断记录,而 binlog 会在事务提交时一次性写入
- binlog记录的是原始逻辑,也就是把 SQL 语句直接存入,redo log 则是物理日志
- redo log 空间固定,binlog 可追加写,写完一个,会继续写另一个,这就说明 binlog 可以用来恢复临时库,因为里面记录任意时刻的原始操作
binlog的工作逻辑
通常备份库里会备份近半个月的 binlog,用于恢复临时库,当然如果想要数据库恢复更久之前的状态,也可以备份更长的甚至是一年的 binlog