参数 innodb_flush_log_at_trx_commit用来控制重做日志刷新到磁盘的策略。该参数的默认值是1,表示事务提交时必须调用一次fsync操作。还可以设置该参数的值为0和2。
0表示事务提交时不进行写入重做日志操作,这个操作仅仅在master thread中完成,而在mastert hread 中每1秒会进行一次重做日志文件的fsynccaozuo 。2表示事务提交时将重做日志写入重做日志文件,但仅写入文件系统的缓存中,不进行fsync操作。在这个设置下,当MySQL数据库发生泵机而操作系统不进行泵机的时候,并不会导致事务的丢失。
我们可以看看这个参数对于事务的影响和对数据库性能的影响。
我们先来创建一张表和一个存储过程
create table test_load(
a int ,
b char(80)
) ENGINE = innodb;
drop PROCEDURE if EXISTS p_load;
CREATE PROCEDURE p_load(count INT UNSIGNED)
begin
DECLARE s int UNSIGNED DEFAULT 1;
DECLARE c CHAR(80) DEFAULT REPEAT('a', 80);
WHILE s <= count do
INSERT INTO test_load select null, c ;
COMMIT ;
set s = s+1 ;
end while ;
END;
CALL p_load(500000);
这里创建了一张表,以及向这张表中插入50w条数据的存储过程,并且调用他。
innodb_flush_log_at_trx_commit参数的默认值是1,该值代表了每次向数据库提交事务都要向磁盘中写入日志。
设计到IO操作,所以在 innodb_flush_log_at_trx_commit=1的情况下性能不会很好。
当我们把值设置为0的时候,50w次的commit仅仅只会做一个日志的写入。
而且对于我们当前的应用,记录一次和记录50w次的日志效果是一样的。
不影响我们当前的业务场景。
而且读者可以将上述的例子拷贝到自己的本地数据库运行下,基本上都是分钟和秒的数量级之间的关系。