MySQL里面最重要的两个日志: 物理日志redo log和逻辑日志binlog
-
redo log(WAL Write-ahead logging,预写式日志)用于保证crash-safe能力(属于InnoDB引擎)
数据页上做了什么修改
循环写的,空间固定会用完
redo log的写入拆成了两个步骤:prepare和commit,这就是”两阶段提交”
-
binlog主要做的是MySQL功能层面的事情(Server层实现)
语句的原始逻辑
binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志
概念
- redo log是循环写的,不持久保存.
- redo log只有InnoDB引擎才有
- binlog日志只能用于归档
innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失
sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数我也建议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。
介绍
redo log
有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。为了解决这个问题,MySQL的使用WAL技术(Write-Ahead Logging)来提升更新效率。
关键点就是先写日志,再写磁盘
有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新才算完成
InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面
redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写.
write pos是当前记录的位置: 一边写一边后移(循环写)
checkpoint是当前要擦除的位置: 往后推移(循环擦除)
有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。
bin log
binlog会记录所有的逻辑操作,并且是采用“追加写”的形式