乐趣区

关于mysql:MySQL-redo与undo日志解析

前言:

后面文章讲述了 MySQL 零碎中常见的几种日志,其实还有事务相干日志 redo log 和 undo log 没有介绍。绝对于其余几种日志而言,redo log 和 undo log 是更加神秘,难以观测的。本篇文章将次要介绍这两类事务日志的作用及运维办法。

1. 重做日志(redo log)

咱们都晓得,事务的四大个性外面有一个是 持久性 ,具体来说就是只有事务提交胜利,那么对数据库做的批改就被永恒保留下来了,不可能因为任何起因再回到原来的状态。那么 MySQL 是如何保障一致性的呢?最简略的做法是在每次事务提交的时候,将该事务波及批改的数据页全副刷新到磁盘中。然而这么做会有重大的性能问题,次要体现在两个方面:

  • 因为 Innodb 是以页为单位进行磁盘交互的,而一个事务很可能只批改一个数据页外面的几个字节,这个时候将残缺的数据页刷到磁盘的话,太浪费资源了。
  • 一个事务可能波及批改多个数据页,并且这些数据页在物理上并不间断,应用随机 IO 写入性能太差。

因而 MySQL 设计了 redo log,具体来说就是只记录事务对数据页做了哪些批改,这样就能完满地解决性能问题了 (相对而言文件更小并且是程序 IO)。

redo log 包含两局部:一个是内存中的日志缓冲(redo log buffer),另一个是磁盘上的日志文件(redo log file)。MySQL 每执行一条 DML 语句,先将记录写入 redo log buffer,后续某个工夫点再一次性将多个操作记录写到 redo log file。

默认状况下,redo log 在磁盘上由名为 ib_logfile0 和 ib_logfile1 的两个物理文件展现。redo log 相干参数简略介绍如下:

  • innodb_log_files_in_group:redo log 文件的个数,命名形式如:ib_logfile0,iblogfile1… iblogfilen。默认 2 个,最大 100 个。
  • innodb_log_file_size:单个 redo log 文件设置大小,默认值为 48M,最大值为 512G,留神最大值指的是整个 redo log 系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值 512G。
  • innodb_log_group_home_dir:指定 redo log 文件组所在的门路,默认./,示意在数据库的数据目录下。
  • innodb_log_buffer_size:redo log buffer 大小,默认 16M。提早事务日志写入磁盘,把 redo log 放到该缓冲区,而后依据 innodb_flush_log_at_trx_commit 参数的设置,再把日志从 buffer 中 flush 到磁盘中。
  • innodb_flush_log_at_trx_commit:管制 redo log 刷新到磁盘的策略,默认为 1。值为 1,每次 commit 都会把 redo log 从 redo log buffer 写入到 system,并 fsync 刷新到磁盘文件中。值为 2,每次事务提交时 MySQL 会把日志从 redo log buffer 写入到 system,但只写入到 file system buffer,由零碎外部来 fsync 到磁盘文件。如果数据库实例 crash,不会失落 redo log,然而如果服务器 crash,因为 file system buffer 还来不及 fsync 到磁盘文件,所以会失落这一部分的数据。值为 0,示意事务提交时不进行写入 redo log 操作,这个操作仅在 master thread 中实现,而在 master thread 中每 1 秒进行一次重做日志的 fsync 操作,因而实例 crash 最多失落 1 秒钟内的事务。

更改 redo log 及其 buffer 大小是须要重启数据库实例的,倡议初始化时做好评估。能够适当加大 redo log 组数和大小,特地是你的数据库实例更新比拟频繁的状况下。但也不举荐 redo log 设置过大。

2. 回滚日志(undo log)

undo log 次要用于保证数据的原子性,保留了事务产生之前的数据的一个版本,能够用于回滚。比方一条 INSERT 语句,对应一条 DELETE 的 undo log,对于每个 UPDATE 语句,对应一条相同的 UPDATE 的 undo log,这样在产生谬误时,就能回滚到事务之前的数据状态。同时,undo log 也是 MVCC (多版本并发管制) 实现的要害。

MySQL 5.7 版本中,undo log 默认寄存在共享表空间 ibdata 中。也能够在初始化时通过配置参数改成独立的文件,简略介绍几个 undo log 相干参数:

  • innodb_max_undo_log_size:管制最大 undo tablespace 文件的大小,当启动了 innodb_undo_log_truncate 时,undo tablespace 超过 innodb_max_undo_log_size 阀值时才会去尝试 truncate。该值默认大小为 1G,truncate 后的大小默认为 10M。
  • innodb_undo_tablespaces:设置 undo 独立表空间个数,范畴为 0 -128,5.7 版本默认为 0,0 示意不开启独立 undo 表空间。该参数只能在最开始初始化 MySQL 实例的时候指定。
  • innodb_undo_directory:设置 undo 表空间的寄存目录,默认数据目录。
  • innodb_undo_log_truncate:设置 undo 表空间是否主动截断回收。该参数失效的前提是,已设置独立表空间且独立表空间个数大于等于 2 个。

undo log 相干参数个别很少改变。MySQL 8.0 默认启用了独立表空间,可能 undo log 表空间的大小设置更灵便些。

总结:

本篇文章次要介绍了 redo log 及 undo log 的作用和相干参数设置,文章写的比拟匆忙,如有谬误,能够留言指出。对于这两类日志更深层次的内容,可能笔者功力还不到,未能写到更加透彻。好了,MySQL 相干日志的两篇文章曾经写完了,心愿各位能学到一点常识。

参考:

  • https://juejin.im/post/6860252224930070536
  • https://www.cnblogs.com/xinysu/p/6555082.html

退出移动版