目录
mysql通过binlog和redo log来保证故障恢复:
前言
mysql
日志主要包括二进制日志、事务日志、慢查询日志、错误日志、查询日志等几大类。
逻辑日志:逻辑日志可以简单理解为执行变更的sql语句。
物理日志:因为mysql数据最终是保存在数据页中的,物理日志记录的就是数据页的变更。
binlog
概念:
binlog
是mysql
的逻辑日志,用于记录数据库执行的写入性操作信息(不包括查询),以二进制的形式保存在磁盘中。binlog
由mysql的服务层负责记录,故无论存储引擎是哪种类型,mysql都会记录binlog。
binlog的使用场景:
主从复制:
在Master
端开启binlog
,然后将binlog
发送到各个Slave
端,Slave
端重放binlog
从而达到主从数据一致。
数据存储异构:
通过binlog将数据同步到其它的存储系统(eg:Redis、ES)中。
- 同步的工具:Databus
数据恢复:
通过使用mysqlbinlog
工具来恢复数据。
redo log
概念:
- mysql事务的持久性就是通过undo log来实现的。
- redo log会把事务中要修改的信息都记录下来,mysql重启时会去根据redo log来进行数据恢复操作(如果存在需要恢复的数据)。
实现:
redo log
包括两部分:内存中的日志缓冲(redo log buffer
) 和 磁盘上的日志文件(redo log file
)。mysql
每执行一条DML
语句,先将记录写入redo log buffer
,后续某个时间点再一次性将多个操作记录写到redo log file
。- 这种先写日志,再写磁盘的技术就是
MySQL
里经常说到的WAL(Write-Ahead Logging)
技术。
说明:
- redo log是innodb引擎特有的。
binlog 和 redolog的关系:
redo log与binlog区别
redo log | binlog | |
---|---|---|
文件大小 | redo log 的大小是固定的。 | binlog 可通过配置参数max_binlog_size 设置每个binlog 文件的大小。 |
实现方式 | redo log 是InnoDB 引擎层实现的,并不是所有引擎都有。 | binlog 是Server 层实现的,所有引擎都可以使用 binlog 日志 |
记录方式 | redo log 采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。 | binlog 通过追加的方式记录,当文件大小大于给定值后,后续的日志会记录到新的文件上 |
适用场景 | redo log 适用于崩溃恢复(crash-safe) | binlog 适用于主从复制和数据恢复 |
mysql通过binlog和redo log来保证故障恢复:
- binlog日志只用于归档,只依靠binlog是没有crash-safe能力的。
- redo log是innodb引擎特有的,且redolog 落盘后会被覆盖掉。
undo log
概念:
- mysql事务的原子性就是通过undo log来实现的。
- 在innodb引擎中,undo Log用来记录每次修改之前的历史值,目的是实现事务的回滚功能,另外innodb中的mvcc也是借助undo log来实现的。
参考: