`
kabike
  • 浏览: 606078 次
  • 性别: 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
分享到:
评论

相关推荐

    MySQL性能优化InnoDB buffer pool flush策略

    MySQL 性能优化 InnoDB buffer pool flush 策略 MySQL 中 InnoDB 存储引擎使用 buffer pool 来缓存从磁盘读取到内存的数据页。Buffer pool 通常由数个内存块加上一组控制结构体对象组成。内存块的个数取决于 buffer...

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    1. 当设置为 0 时,InnoDB 会在每秒末将 log buffer 写入文件系统缓存,并执行 flush 操作将缓存数据写入磁盘。这意味着如果系统在这一秒内发生故障,可能会丢失最近一秒钟的事务数据。 2. 如果设置为 1,每次事务...

    XtraDB、InnoDB 内部结构示意图

    innodb_flush_log_at_trx_commit参数控制了InnoDB如何刷新事务日志。通常,InnoDB使用一个后台线程“log thread”在磁盘上通过fsync()命令来刷新日志。文章还提到了Redo日志文件组中文件的数量,通常是2到3个。 9. ...

    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

    MySQL5.6基本优化配置

    - `innodb_flush_log_at_trx_commit` 设置为2,这意味着每次提交事务时,重做日志缓冲区会被写入日志文件,但不立即同步到磁盘,提供了一定的性能和数据安全平衡。 - `innodb_file_per_table` 开启,每个表的索引...

    MYSQL innodb性能优化学习总结

    - **innodb_flush_log_at_trx_commit**:控制日志写入磁盘的策略,对于实时业务交易,一般配置为2,既保证了事务的一致性又减少了性能损耗,而设置为0或2时在系统崩溃时可能会有数据丢失的风险。 - **innodb_read_...

    MySql Innodb 引擎特性详解

    - `innodb_flush_log_at_trx_commit`:控制日志刷新频率,2表示每秒刷新一次,这在大多数情况下是一个不错的折衷方案。 2. **优化主键设计**:选择尽可能小的主键类型,并确保索引尽可能小,以提高索引效率。 3...

    InnoDB性能优化参数详解.docx

    9. **innodb_log_buffer_size**:设置事务日志缓冲区的大小,较大的缓冲区可以提高性能,但需考虑在故障时可能丢失的数据。建议值介于1MB至8MB之间。 10. **innodb_log_file_size**:定义单个日志文件的大小,直接...

    MySQL Innodb 参数详解与优化实践

    `innodb_flush_log_at_trx_commit` - **描述**:控制事务提交时是否同步写入日志文件,默认值为0。 - **应用场景**:设置为1可增强数据安全性,但可能会降低性能;设置为0则牺牲安全性换取更高性能。 ##### 9. `...

    事务已提交,数据却丢了,赶紧检查下这个配置!!!1

    3. `innodb_flush_log_at_trx_commit=2`:在这种模式下,每次事务提交时只将Log Buffer写入OS cache,而不立即同步到磁盘,减少了fsync操作,提高了性能,但增加了数据丢失的风险。 根据业务需求,不同的应用场景...

    mysql-innodb

    lock_mode`控制自增列的锁定模式,`innodb_buffer_pool_size`设定缓冲池大小,以及`innodb_flush_log_at_trx_commit`决定事务日志何时写入磁盘等。这些变量可以根据系统需求进行优化。 7. **其他特性**: InnoDB还...

    可以改善mysql性能的InnoDB配置参数

    6. **innodb_flush_log_at_trx_commit**:此参数控制事务日志的持久化策略,影响事务的ACID特性。设置为1确保每次提交都同步到磁盘,牺牲速度以保证强一致性;设置为0或2则可能牺牲一些一致性以换取性能提升。 7. *...

    MySQL零拷贝技术详解.pdf

    innodb_flush_method 参数同时控制 redo log buffer 和 innodb buffer pool 缓冲区刷新策略,其中 log files 是 redo log buffer 在内存中的缓存区,log files 是磁盘上的 Redo Log 文件;data files 是 innodb ...

    MySQL数据页功能性能测试innodb-page-size

    7. `innodb_log_files_in_group`、`innodb_flush_log_at_trx_commit`、`innodb_log_file_size` 和 `innodb_max_dirty_pages_pct` 与事务日志和脏页处理相关,确保事务安全性和性能平衡。 测试工具 Sysbench 被用来...

    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数据库技术分享.ppt

    5. 磁盘IO优化:通过调整磁盘IO参数,例如sync_binlog、innodb_flush_log_at_trx_commit等,来提高MYSQL数据库的性能。 MYSQL数据库慢SQL定位与分析 MYSQL数据库慢SQL定位与分析是MYSQL数据库性能优化的重要步骤。...

    MySQL8.0内存相关参数总结

    不过,也需要考虑`innodb_flush_log_trx_commit`参数,以控制何时将日志缓冲区内容刷新到磁盘,以确保数据一致性。 4. **thread_cache_size**: 线程缓存大小,用于保存已准备好的线程,当新的连接请求到来时,...

    MYSQL-innodb性能优化学习总结.pdf

    6. **innodb_flush_log_at_trx_commit**:决定事务日志何时写入磁盘。值为2时,保证ACID特性,但牺牲性能;值为0或1时,性能较高,但可能丢失部分事务数据。 7. **innodb_read_io_threads** 和 **innodb_write_io_...

Global site tag (gtag.js) - Google Analytics