事务日志刷写参数 innodb_flush_log_at_trx_commit=0|1|2三个值
其原理如下图
image
1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性
0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务
2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失
高并发业务行业最佳实践,是使用第三种折衷配置(=2):
1.配置为2和配置为0,性能差异并不大,因为将数据从Log Buffer拷贝到OS cache,虽然跨越用户态与内核态,但毕竟只是内存的数据拷贝,速度很快
2.配置为2和配置为0,安全性差异巨大,操作系统崩溃的概率相比MySQL应用程序崩溃的概率,小很多,设置为2,只要操作系统不奔溃,也绝对不会丢数据
那么我们了解了参数innodb_flush_log_at_trx_commit=0|1|2
无非是1是最安全的,每条事务commit后都需要立即从事务日志缓冲区log buffer 执行落盘
0是每条事务commit后会继续放到事务日志缓冲区log buffer中,但是每隔一秒就会落盘log buffer中已提交的事务。假如log buffer中存了上千上万个已提交事务,这一秒也要落盘完。
2和0一样,每条事务commit后不会立即落盘,而是放到os buffer缓冲区中,它和0的区别就是:
0将已提交的事务放在log buffer即mysql的在内存的日志缓冲区,而2是将已提交的事务放到os buffer 系统的内存缓冲区,从用户态转向内核态仅此而已。
准备阶段
库下创建数据表testlog 查看初始大小
use helldb;
CREATE TABLE `testlog` (
`id` int NOT NULL AUTO_INCREMENT,
`name` char(10) DEFAULT NULL,
`age` int DEFAULT '20',
PRIMARY KEY (`id`)
) ENGINE