redo log
redo log
是InnoDB存储引擎层面的实现,并非所有存储引擎都具备。
redo log
用于记录事务对数据页的修改。
redo log
采用WAL(Write-Ahead Log)技术,先将记录写入内存中的Redo Log Buffer,再在一定时机将缓存写入磁盘。
innodb_flush_log_at_trx_commit
参数用于设置redo log
刷盘时机:
0
:InnoDB线程每秒1次将Redo Log Buffer中的日志刷入磁盘。
1
:事务每次提交时就会把Redo Log Buffer中的日志写入磁盘。
2
:事务提交时仅写入OS Buffer,由InnoDB线程每秒1次将OS Buffer中的日志刷入磁盘。
redo log
采用大小固定、循环写入的方式,当写到文件结尾时,回到文件头部循环写入日志。因此redo log
无法记录完整的数据,必须配合binlog
才能保证数据不丢失。
redo log
用于数据服务奔溃后的恢复。
undo log
undo log
记录数据的逻辑变化,例如当执行了一条INSERT
语句,undo log
会记录一条对应的DELETE
语句,这样便于数据回滚到事务执行前的状态。
undo log
还用于MVCC。
undo log
保证事务的原子性。
binlog
binlog
是MySQL服务层的实现,因此所有存储引擎都能使用。
binlog
日志是二进制格式的,具有以下三种工作模式:
Row Level
:日志会记录每一行数据被修改的情况,支持一些特殊功能(存储过程、触发器、函数),但会造成日志内容庞大。
Statement Level
:日志会记录对数据进行修改的SQL语句,减少了日志量,但不支持一些语句。是默认的工作模式。
Mixed
:混合以上两种模式,根据执行的具体语句判断使用哪种工作模式。
binlog
是以追加写入的方式执行的,当一个bin log文件到达设置的最大值(max_binlog_size
)时,会另生成新的文件来保存新的日志。
binlog
会在每次事务提交时写入内存,并在一定时机写入磁盘,通过sync_binlog
参数设置刷盘时机,默认为1
即每次提交事务的时候都进行刷盘,如果将此参数调大可以牺牲一定的一致性来提升性能。
binlog
主要用于MySQL主从复制,监听binlog
能用于数据同步、作为实时计算引擎的数据源。