MySQL写入重做日志(redo log files)的顺序
一、提出问题
在redo logs中,如果有多个files,那么MySQL会怎么使用这些文件,访问的时间,第一个文件写完,再使用第二个依次循环?还是不同的事务访问不同的file?
二、查看源码
通过查看代码,其是通过计算:当前lsn-文件的lsn,差值对文件个数进行取模,分发到不同的文件。
结论:
- 不是写完一个文件,再去写另一个文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uint64_t log_files_real_offset_for_lsn(const log_t &log, lsn_t lsn) {
uint64_t size_offset;
uint64_t size_capacity;
uint64_t delta;
ut_ad(log_writer_mutex_own(log));
size_capacity = log.n_files * (log.file_size - LOG_FILE_HDR_SIZE);
if (lsn >= log.current_file_lsn) {
delta = lsn - log.current_file_lsn;
delta = delta % size_capacity;
} else {
/* Special case because lsn and offset are unsigned. */
delta = log.current_file_lsn - lsn;
delta = size_capacity - delta % size_capacity;
}
size_offset = log_files_size_offset(log, log.current_file_real_offset);
size_offset = (size_offset + delta) % size_capacity;
return (log_files_real_offset(log, size_offset));
}
三、相关配置的说明
innodb_log_files_in_group
- The number of log files in the log group. InnoDB writes to the files in a circular fashion. The default (and recommended) value is 2. The location of the files is specified by innodb_log_group_home_dir. The combined size of log files (innodb_log_file_size * innodb_log_files_in_group) can be up to 512GB.
即: 配置日志组中的日志个数,InnoDB以循环的方式写入文件。
并不是写满一个文件,再写另一个!