MySQL进阶之MySQL数据库整体架构设计( 三 )


默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1和ib_logfile2 。
-- 指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下innodb_log_group_home_dir=./-- 指定重做日志文件组中文件的数量,默认2innodb_log_files_in_group=2-- 重做日志文件的大小innodb_log_file_size=50331648-- 重做日志缓冲区大小innodb_log_buffer_size=16777216很重要一点,redo log是什么时候写入磁盘的?前面说了是在事务开始之后逐步写盘的 。之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志文件,原因就是,重做日志有一个缓存区,其默认大小为8M(或16M),Innodb存储引擎先将重做日志内容写入缓存区中 。然后以下三种情况下,都会将缓冲区的日志内容刷新到磁盘
1. 主线程每秒一次执行刷新重做日志缓冲区到重做日志文件
2. 每个事务提交时会将重做日志刷新到重做日志文件,如果有配置这个变量的话
3. 当重做日志缓存可用空间少于一半时,重做日志缓存会被刷新到重做日志文件
由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,重做日志从缓冲区到重做日志文件是主线程的定时任务 。
因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步
开始的 。
另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:
即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件 。这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的 。

  • 回滚日志(undo log)
也是事务相关的日志,实现回滚 。
它保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读 。它是逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的 。
事务开始之前,将当前的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性。
当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间 。
MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间文件的默认的名称是ibdata,位于数据文件目录中 。
MySQL5.6之后,undo表空间可以配置成独立的文件,但是需要提前在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数 。如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了 。
关于MySQL5.7之后的独立undo 表空间配置参数如下
-- undo独立表空间的存放目录,默认值是./innodb_undo_directory = /data/undospace/ --回滚段为128KB,默认值得128innodb_undo_logs = 128 --指定有4个undo log文件,默认值0innodb_undo_tablespaces = 4 如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为
与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置 。
mysql> show variables like 'innodb_data_file_path';+-----------------------+------------------------+| Variable_name| Value|+-----------------------+------------------------+| innodb_data_file_path | ibdata1:12M:autoextend |+-----------------------+------------------------+ undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生 。
默认情况下undo文件是保存在共享表空间的,也即ibdata文件中,当数据库中发生一些大的事务
性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的 。
因此共享表空间可能会变得很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的 。
因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。
  • 中继日志(relay log)
在主从复制应用场景下,其内容为从主机读取的bin log日志写入的内容 。
总结关于MySQL数据库的架构设计,主要了解其逻辑架构,执行流程,重点掌握InnoDB和MyISAM等引擎的选型,以及日志文件中二进制日志、慢查询日志、重做日志、回滚日志等日志的原理和配置 。


推荐阅读