innodb_flush_log_at_trx_commit参数测试

参数说明:

不管在官网还是其他网站上均能看到innodb_flush_log_at_trx_commit=【0,1,2】三种值:

innodb_flush_log_at_trx_commit = 0 :每秒将日志缓冲区写入log file,并同时flush到磁盘。跟事务提交无关。在机器crash并重启后,会丢失一秒的事务日志数据(并不一定是1s,也许会有延迟,跟操作系统调度有关)。

innodb_flush_log_at_trx_commit = 1:每次事务提交将日志缓冲区写入log file,并同时flush到磁盘。(crash不会丢失事务日志)

innodb_flush_log_at_trx_commit = 2:每次事务提交将日志缓冲区写入log file,每秒flush一次到磁盘。(crash有可能丢失数据)

测试验证:

环境说明:

操作系统:windows 7
MySQL:5.6.26

准备:

-- 建立测试表
use test
create table t_innodb (a int) engine=innodb;
create table t_myisam (a int) engine=myisam;
-- 建立插入数据存储过程
delimiter //
create procedure insert_testdata(p1 int)
begin
 set @x:=0;
 repeat
  set @x:[email protected]+1;
  insert into t_myisam values (@x);
  insert into t_innodb values (@x);
  commit;
 until @x>p1 end repeat;
end
//
delimiter ;

(1)innodb_flush_log_at_trx_commit = 0 测试

net stop mysql   --停止Mysql服务
更新my.ini
  innodb_flush_log_at_trx_commit = 0   --更新innodb_flush_log_at_trx_commit = 0
  net start mysql         --重新启动Mysql服务  mysql -u root -p   use test   call insert_testdata(1000000);  将mysqld进程杀掉。模拟crash场景。  net start mysql

结果截图:

(2)innodb_flush_log_at_trx_commit = 1 测试

truncate table t_innodb;
truncate table t_myisam;
net stop mysql
更新my.ini
  innodb_flush_log_at_trx_commit = 1
net start mysql
mysql -u root -p
use test
call test_insertdata(1000000);

将mysqld进程杀掉。模拟crash场景。

(3)innodb_flush_log_at_trx_commit = 2 测试

truncate table t_innodb;
truncate table t_myisam;
net stop mysql
更新my.ini
  innodb_flush_log_at_trx_commit = 2
net start mysql
mysql -u root -p
use test
call insert_testdata(1000000);

将mysqld进程杀掉。模拟crash场景。

重启后,数据未丢失。

再次 call insert_testdata(1000000); 将mysqld进程杀掉。模拟crash场景。丢失一条数据。

注意:

大家肯定记得还有控制二进制日志的 sync_binlog 参数,而且还会很容易混淆,下面谈一谈sync_binlog:

sync_binlog = 0  (mysql默认值 )由文件系统决定将binlog同步到硬盘。

sync_binlog = 1  每提交一次事务,写一次binlog,并使用fdatasync()同步到硬盘。

sync_binlog > 1  每提交一次事务,写一次binlog,达到sync_binlog 设定的值后,调用fdatasync()同步到硬盘。

(1)如果在主从复制架构下:

在 sync_logbin = 1 的情况下, 每次提交事务都会同步到磁盘,保证日志的持久性,也可以保证主从复制的一致性 。

在 sync_logbin = 0,或者>1的值,很有可能机器出现crash,日志并没有同步到磁盘,重启后,二进制日志的position比备库同步过去的position小,造成数据不一致情况。

(2)没有主从架构,单独数据库实例:

在 sync_logbin = 1 的情况下, 每次提交事务都会同步到磁盘,保证日志的持久性,能够保证存储下了所有提交的事务 。能够用来进行恢复。

在 sync_logbin = 0,或者>1的值,很有可能机器出现crash,日志并没有同步到磁盘,重启后,二进制日志很可能丢失已提交事务,所以不能用来进行恢复操作,因为它有丢失事务。

总结:

innodb_flush_log_at_trx_commit 参数对数据完整性有非常大的作用,强烈建议使用 innodb_flush_log_at_trx_commit = 1 ; sync_binlog = 1 ; --虽然会很影响性能,但是对于数据很重要的情况下,必须设置。

时间: 2024-10-05 23:54:34

innodb_flush_log_at_trx_commit参数测试的相关文章

mysql 参数 innodb_flush_log_at_trx_commit

问题,项目后台有一个定时任务,需要跑一批数据,跑完后存入到一个表里,用来做信息查询,数据大,逻辑复杂,耗时,多线程处理数据? 解答:以为程序的问题,把所有的关键点步骤都加上了日志,拿开发环境的日志看,一点没毛病,后来排查到Mysql,是不是服务器挂了,通过命令来查看,确实没有挂,是不是项目过载,也挂了,也没有,最后想起来,mysql可能不是实时刷入磁盘的,所有像运维拿到了my.cnf配置文件,果然是一个参数问题.运维让插入数据度快,innodb_flush_log_at_trx_commit 这

innodb_flush_log_at_trx_commit 和sync_binlog介绍

innodb_flush_log_at_trx_commit 是ib_logfile这个文件的刷新方式 sync_binlog 是mysql-bin.000的刷新方式 innodb_flush_log_at_trx_commit 和 sync_binlog 是 MySQL 的两个配置参数,前者是 InnoDB 引擎特有的.之所以把这两个参数放在一起讨论,是因为在实际应用中,它们的配置对于 MySQL 的性能有很大影响. 1. innodb_flush_log_at_trx_commit 简而言之

innodb_flush_log_at_trx_commit

很多翻译文章都把innodb_flush_log_at_trx_commit的翻译得很勉强,导致阅读中文解析也不能完全理解,今天翻了下官方文档,大致意思如下: 当设置1时(默认值): 每次事务提交(commit),都会将log buffer的内容写到(write out)log file,并做刷写(flush to disk)操作(保证数据持久化) 当设置0时: 大约每秒(考虑程序调度,不保证每秒)都将log buffer的内容写到(write out)log file,并做刷写(flush t

Junit多参数测试

日前,为测试一个传入多参数的方法,使用了junit进行单元测试,由于接触单元测试不久,很多不熟悉的地方,弄了挺久的. 这里试用了两种方法进行测试,由于是新手,很多需要改善学习. 示例方法: public void add(Long a,Long b,String c,String d,Date date1,Date 2){...} 假设a和b的取值范围为{-1,0,1,2},c和d的取值为{null,"123","sdfsdf"},data1和data2的取值为{n

Mysql配置innodb_flush_log_at_trx_commit

当innodb_flush_log_at_trx_commit被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作.当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新.当设置为2之时,在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新.尽管如此,在对日志文件的刷新在值为2的情况也每秒发生一次.我们必须注意到,因为进程安排问题,每秒一次的刷新不是100%保证每秒都发生.你可以通

浅析innodb_support_xa与innodb_flush_log_at_trx_commit

很久以前对innodb_support_xa存在一点误解,当初一直认为innodb_support_xa只控制外部xa事务,内部的xa事务是mysql内部进行控制,无法人为干预(这里说的内部xa事务主要是指binlog与innodb的redo log保持一致性所采用的内部xa事务).直到前阵子在微博上看到有人讨论mysql数据安全时才仔细去手册上查看了关于innodb_support_xa的解释,这几天又与同事再次讨论了这个问题,于是想着还是将其记录下来.先看官方手册上对innodb_suppo

innodb_flush_log_at_trx_commit理解

innodb_flush_log_at_trx_commit 如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作.如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.如果inn

MySQL参数:innodb_flush_log_at_trx_commit 和 sync_binlog

innodb_flush_log_at_trx_commit 和 sync_binlog 是 MySQL 的两个配置参数,前者是 InnoDB 引擎特有的.之所以把这两个参数放在一起讨论,是因为在实际应用中,它们的配置对于 MySQL 的性能有很大影响. 1. innodb_flush_log_at_trx_commit 简而言之,innodb_flush_log_at_trx_commit 参数指定了 InnoDB 在事务提交后的日志写入频率.这么说其实并不严谨,且看其不同取值的意义和表现.

1118sync_binlog innodb_flush_log_at_trx_commit 浅析

转自 http://blog.itpub.net/22664653/viewspace-1063134/ innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数.本文从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能,数据的影响. 一 参数意义 innodb_flush_log_at_trx_commit 如果innodb_flush_log_at_trx_commit设置为0,log bu