InnoDB日志保存着已经提交的数据变化,用于在崩溃恢复时把数据库的变化恢复到数据文件,除了崩溃恢复,其他时候都不会读日志文件。向日志文件写数据的方式是顺序写,这比离散写的效率要高很多,而向数据文件写数据通常是离散写比较多。
日志缓冲区是一个内存缓冲区,InnoDB使用它来缓冲重做日志事件,然后再将其写入磁盘。日志缓冲区的大小由系统参数innodb_log_buffer_size控制,默认是16 MB,在大多数情况下是够用的。
如果有大型事务或大量较小的并发事务,可以考虑增大innodb_log_buffer_size,这个参数在MySQL 8中可以动态设置。默认在datadir下有两个48MB的日志文件ib_logfile0和ib_logfile1。
查询redo 的日志产生量
InnoDB的日志产生量是衡量数据库繁忙程度的重要指标,也是设置日志文件大小的依据。查询日志产生量的相关信息有两个方法。
查询information_schema.innodb_metrics或sys.metrics视图中的对应计量值。
第二个方法是使用show engine innodb status命令查询日志产生量的相关信息,这些信息在输出的LOG部分,这种方法不需要激活InnoDB中的相关计量。
(1)视图查询
set global innodb_monitor_enable = 'log_lsn_%';
select name , count, status from information_schema.innodb_metrics where name like 'log_lsn%';
这里的log_lsn_checkpoint_age是当前日志量减去最近一次检查点的日志量,等于log_lsn_current减去log_lsn_last_checkpoint,也就是日志文件的使用量,因
为对日志文件的写入是循环覆盖的,检查点之前的日志都已经写入数据文件了,不再需要了,可以被覆盖。这里看到的日志文件的使用量大约是9MB。
(2)show engine innodb status\G
这里的lsn是184386847,最近一次检查点的lsn是178228435,计算出当前日志文件的使用量是这两个值之差:大约5.8M
MySQL默认在数据目录下有两个48MB的日志文件,ib_logfile0和ib_logfile1。对于繁忙的数据库,这样的日志文件通常太小,因为当日志文件写满时,会触发检查点,把内存中的数据写入磁盘,小
的日志文件会频繁地触发检查点,增加写磁盘频率,引起系统性能下降。
大的日志文件能容纳的数据变化量大,会造成数据库在崩溃恢复时耗时较长,但新的MySQL版本的崩溃恢复速度已经很快了,因此把日志文件设置得大一些通常不会错,甚至可以设置得和InnoDB缓
存池一样大。
另外一些备份工具要备份在备份过程中产生的重做日志, 如果日志文件过小,备份工具备份日志的速度跟不上日志产生的速度时,需要备份的日志可能已经被覆盖了,例如XtraBackup工具可能会遇
到下面的错误:
xtrabackup: error: it looks like InnoDB log has wrapped around before xtrabackup could
process all records due to either log copying being too slow, or log files being too small.
判断如何配置redo log的大小
一个合理大小的日志文件应该可以容纳数据库在高峰时1到2个小时的数据变化。下面的例子是查询一分钟产生的日志量:
在这60s期间,我们业务系统处于正常的运行状态,此次为实验环境,我做了简单的业务模拟操作。
select round((1167787001- 1159609513)*60/1024/1024) "1 hour log(MB)";
lsn号从1159609513增长到1167787001
一分钟redo log量:select round((1167787001- 1159609513)/1024/1024) "1 min log(MB)" =8MB
一小时redo log量:select round((1167787001- 1159609513)*60/1024/1024) "1 hour log(MB)"; =468MB
日志文件的大小有两个参数决定:
(1)innodb_log_files_in_group:表示一个组里有多少个文件,默认为2。
(2)innodb_log_file_size:表示单个日志文件的大小,默认为48MB。
因此如果保持innodb_log_files_in_group为2 不变,把innodb_log_file_size设置为460MB,可以容纳高峰期两个小时的日志。
修改日志文件大小的方法
修改日志文件大小的方法很简单,只需要修改参数文件中的innodb_log_file_size的设置,然后重新启动MySQL即可。不需要删除当前的日志文件,在启动过程中,MySQL会发现参数值和当前日志文件的大小不一样,然后自动删除旧的日志文件,并创建新的日志文件,在MySQL的错误日志里会有如下记录:
innodb_log_file_size=460M