这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
这里讲解一下有关MySQL的redo log和undo log
redo log是重做日志,主要是在数据库异常重启时有crash_safe的能力,避免记录的丢失
undo log是回滚日志,主要是一条记录在更新操作后也能够通过回滚的方式回到前一个状态的值
那么两者具体是怎么执行和实现的呢?
redo log - 保证持久性
redo log是InnoDB引擎特有的,在引擎层实现,主要用于恢复记录,防止数据丢失。redo log 是两阶段提交,有固定大小。 redo log只记录事务对数据页做了哪些修改,包含了两部分:
- 内存中的日志缓冲 - redo log buffer
- 磁盘中的日志文件 - redo log file
MySQL每执行一条DML语句,先将记录写入redo log buffer,再在系统空闲时将多个操作写入redo log file
redo log相关参数
- innodb_log_files_in_group:redo log文件的个数,默认2个,最大100个【ib_logfile0, ib_logfile1, ...】
- innodb_log_file_size: 单个redo log文件设置大小 - 默认值48M,最大值【整个redo log系列文件之和 innodb_log_files_in_group * inndb_log_file_size】512G
- innodb_log_group_home_dir: 指定redo log文件组所在的路径
- innodb_log_buffer_size: redo log buffer大小,默认16M -
- innodb_flush_log_at_trx_commit: 控制redo log刷新到磁盘的策略
undo log - 保证原子性 + MVCC实现的关键
保存了事务发生之前的数据的一个版本 - 可以用于回滚
EG: 一条INSERT语句 - 对应一条DELETE语句undo log
每个UPDATE语句,对应一条相反的UPDATE的undo log - 在发生错误时,就能回滚到事务之前的数据状态
undo log相关参数
- innodb_max_undo_log_size:控制最大 undo tablespaces文件的大小。启动了innodb_undo_log_truncate - undo tablespace 超过innodb_max_undo_log_size 阈值才会去尝试truncate。默认1G,truncate后的大小默认为10M
- innodb_undo_tablespaces:设置undo独立表空间个数 - 范围0-128
5.7版本默认为0【不开启独立undo表空间(最开始初始化MySQL实例时指定)】 - innodb_undo_directory:设置undo表空间的存放目录 - 默认数据目录
- innodb_undo_log_truncate:设置undo表空间是否自动截取回收 - 该参数生效的前提是 - 已设置独立表空间且独立表空间个数大于等于2
有关 innodb_undo_tablespaces【设定创建的undo表空间的个数】 设置为2/更大的值 - 真的出现大事务导致回滚段过大 - 设置后清理起来更方便