`
kabike
  • 浏览: 598470 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Innodb log buffer的flush

 
阅读更多
innodb为了保持事务的特性,需要redo log的支持,
即ib_logfile0,ib_logfile1这几个file(它的undo log是放在innodb的共享表空间的)
innodb向redo log进行write和flush操作.

注意,write和flush是两种不同的操作,write是向文件写入内容,此时内容可能只是在操作系统缓存中,flush才是真正把文件内容刷到硬盘上(有些情况下操作系统即使flush了也是flush到硬盘的缓存中,还没有真正到硬盘上.有些操作系统会报告flush成功,其实也没有进行flush).但是总之flush是一个非常昂贵的IO操作.

innodb向log file进行flush,是由参数innodb_flush_log_at_trx_commit控制的.
http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit


默认情况是1.即每一次commit导致一次log file的flush.这保证了最大的事务持久性(即ACID的D)
比如看下表和如下sp
show create table 20130228t1;
CREATE TABLE `20130228t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `b` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

show create PROCEDURE  sp1;
CREATE  PROCEDURE `sp1`()
BEGIN
DECLARE v_counter int DEFAULT 0;
 while v_counter<1000 do
  insert into 20130228t1 values(null,v_counter);
  commit;
  set v_counter:=v_counter+1;
 end while;

END


一开始在innodb_flush_log_at_trx_commit=1的时候执行该sp,观察Innodb_os_log_fsyncs变量的变化

show STATUS like 'Innodb_os_log_fsyncs';
执行前Innodb_os_log_fsyncs 为 5441,然后执行 call sp1();
执行后Innodb_os_log_fsyncs 为7447,也就是说执行了2000多次文件flush
插入这1000条数据,用了1分钟左右


下面把innodb_flush_log_at_trx_commit设为2
set global innodb_flush_log_at_trx_commit=2

执行前Innodb_os_log_fsyncs 为 7450,然后执行 call sp1();
执行后Innodb_os_log_fsyncs 为7452.
这次居然连1s都不到就执行完了.....
不过速度虽然快了,事务持久性不一定能保证了.这种情况下如果机器突然断电,很有可能会丢失一部分事务.


想到如果导入大量数据的情况下,如果减少log file的flush,是不是会更快呢.
比如load data infile的情况下.(见http://kabike.iteye.com/blog/1812206
于是把innodb_log_buffer_size改为了16M(原来是8M),希望在有big transaction的情况下减少Innodb_os_log_fsyncs的次数.
不料这次效果提升并不显著.Innodb_os_log_fsyncs并没有明显减少.

原来innodb无论如何要每秒flush一次redo log
http://dev.mysql.com/doc/refman/5.1/en/innodb-tuning.html
引用

If you can afford the loss of some of the latest committed transactions if a crash occurs,
you can set the innodb_flush_log_at_trx_commit parameter to 0.
  InnoDB tries to flush the log once per second anyway,
  although the flush is not guaranteed.
  Also, set the value of innodb_support_xa to 0,
  which will reduce the number of disk flushes due to synchronizing on disk data and the binary log.

它这个每秒flush redo log的特性应该加到innodb_flush_log_at_trx_commit的说明里嘛.
要不大家怎么知道innodb_log_buffer_size设置过大也没有意义呢.
1
3
分享到:
评论

相关推荐

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    这样的好处,减少了事务数据丢失的概率,而对底层硬件的 IO 要求也没有那么高(log buffer 写到文件系统中,一般只是从 log buffer 的内存转移

    my.cnf参数配置实现InnoDB引擎性能优化

    3. innodb_log_buffer_size 4. innodb_flush_log_at_trx_commit 然后自己写了两个例子,一个单线程的,一个多线程的来通过改变配置参数来测试是否提高了性能。结果是只有innodb_flush_log_at_trx_commit可以提高...

    数据库优化配置.doc

    [client] port=3306 [mysql] no-beep default-character-set=utf8 [mysqld] datadir=D:/Data port=3306 server-id=...log_file_size=1G innodb_log_buffer_size=8M innodb_flush_log_at_trx_commit=2 innodb_file_per_t

    mysql参数及其优化

    query_cache_size、query_cache_type、innodb_buffer_pool_size、innodb_log_file_size、innodb_log_buffer_size、innodb_flush_logs_at_trx_commit、transaction_isolation、innodb_file_per_table、innodb_open_...

    mysql数据库插入速度和读取速度的调整记录

    这次修改了下面四个配置项: 1)将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。 0: Write the log buffer to the log file and flush the log file every second, but ...

    MySQL 句柄数占用过多的解决方法

    在Windows下安装MySQL ,用了官方的配置... 后来又看到一个设置innodb_flush_log_at_trx_commit  innodb_flush_log_at_trx_commit (这个很管用)  抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默

    mysql 数据库中my.ini的优化 2G内存针对站多 抗压型的设置

    默认为2402,调到512-1024最佳 innodb_additional_mem_pool_size=4M 默认为2M innodb_flush_log_at_trx_commit=1 (设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1) innodb_log_buffer_size=2M ...

    InnoDBinsert性能拐点测试

    上篇blog《InnoDBselect性能拐点测试》测试了InnoDBselect的性能拐点,...  1、调整my.cnf的参数如下:  innodb_file_per_table=0  innodb_flush_log_at_trx_commit=2  innodb_buffer_pool_size=8G  innodb_file_i

    mysql数据库my.cnf配置文件

    # 0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。 # 主线程中每秒会将重做日志缓冲写入磁盘的...

    MySQL详解视频.zip

    log buffer 事务提交 Undo Log 事务回滚 DoubleWite Buffer Change Buffer oMySql隔离级别和锁机制详解 MySql锁 性能 o乐观锁 o悲观锁 操作 o读锁 o写锁 粒度 o表锁 o行锁 其他 o间隙锁 o临建...

Global site tag (gtag.js) - Google Analytics