redo log 重做日志,innodb存储引擎实现的日志,用于实现持久化特性,并提高写入磁盘的速度。
计算机系写入数据比较快的方式:
- 内存写入
- 磁盘顺序写
如果没有redo log,因为要保证事务,修改后的数据就不能以异步io的形式写入到ibd文件,ibd是分散的数据,写入比较占用时间,最终会导致mysql的性能很差。
redo log实现了磁盘顺序写,而且都是物理级的改动,数据量也很小。
redo log模型
redo log 默认存在2个文件,可以设置最大100个文件,这些文件组成了一个环形,redo log先0号文件从头开始写,等写到最后一个文件时,又会回到0号文件开始写
redo log使用了2个指针,用于重复写入
write pos 当前写入的位置,指针按环形移动。
checkpoint 当前要擦除的位置,checkpoint在write pos前面, 专门为write pos清理好空间,当write pos接近时,check point会向后移动擦除数据。
参数设定
show variables like '%var%'; //查询当前变量
set global var=xx; //设置变量
innodb_log_buffer_size //设置redo log buffer大小参数,默认16M ,最大值是4096M,最小值为1M。
innodb_log_group_home_dir //设置redo log文件存储位置参数 文件名 ib_logfile0 ib_logfile1..
innodb_log_files_in_group //设置redo log文件的个数 默认2 最大100, 这些文件组成环形
innodb_log_file_size //设置单个redo log文件大小,默认值为48M。最大值为512G
innodb_flush_log_at_trx_commit //redo log 的写入策略,存在3个策略
0 事务提交不写磁盘,继续存放在redo log buffer中, 数据库宕机丢数据
1 默认值,每次提交事务都会写入磁盘, 最安全
2 提交事务,写入到操作系统文件缓存 page cache, 服务器宕机丢数据