简介:

数据库的东西,往往一个参数就牵涉N多知识点。所以简单的说一下。大家都知道innodb是支持事务的存储引擎。事务的四个特性ACID即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)。其中原子性,一致性,持久性通过redo log 和 undo来实现。redo log称为重做日志,用来保证事务的原子性和持久性。undo log用来保证事务的一致性。 当事务提交时,必须先将该事务的所有日志写入到重做日志文件(redo log)进行持久化(当然先写到日志缓冲区,而不是直接写文件,关于什么时候刷新到磁盘文件,是一个比较复杂的问题,同学们自行查阅资料),待事务提交操作才算完成。innodb的redo log是顺序I/O,所以设置合适的值能够大大提高数据库性能。那么是不是设置的越大越好呢?

设置的太小:当一个日志文件写满后,innodb会自动切换到另外一个日志文件,而且会触发数据库的检查点(Checkpoint),这会导致innodb缓存脏页的小批量刷新,会明显降低innodb的性能。

设置的太大:设置很大以后减少了checkpoint,并且由于redo log是顺序I/O,大大提高了I/O性能。但是如果数据库意外出现了问题,比如意外宕机,那么需要重放日志并且恢复已经提交的事务,如果日志很大,那么将会导致恢复时间很长。甚至到我们不能接受的程度。

那么我们如何估算log file该设置为多大?通常我们可以通过观察show status中innodb_os_log_written状态变量来查看innodb对日志文件写出了多少数据。一个好用的经验是,查看10-100秒间隔的数字,然后记录峰值。可以用这个判断日志缓冲是否设置的正好。例如,若看到峰值是每秒写100kb数据到日志,那么1MB的日志缓冲已经足够了。也可以使用这个衡量标准来决定日志文件设置多大会比较好。如果峰值是100KB/s,那么256M的日志文件足够存储至少2560秒的日志记录。一般来说,日志文件的全部大小,应该足够容纳服务器一个小时的活动内容。

下面看实际的测试(由于是虚拟机,所以使用sysbench模拟据量写入,生产环境选择数据库最繁忙的时候测试):

[root@yayun-mysql-server ~]# sysbench --test=oltp --oltp-table-size= --oltp-read-only=off --init-rng=on --num-threads= --max-requests= --oltp-dist-type=uniform --max-time= --mysql-user=root --mysql-socket=/tmp/mysqld.sock --mysql-password= --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex prepare    

1.首先计算innodb每分钟产生的日志量:

(root@yayun-mysql-server) [(none)]>pager grep sequence
PAGER set to 'grep sequence'
(root@yayun-mysql-server) [(none)]>show engine innodb status\G select sleep(60); show engine innodb status\G
Log sequence number 6377275259
1 row in set (0.00 sec) 1 row in set (1 min 0.00 sec) Log sequence number 6403945555
1 row in set (0.00 sec) (root@yayun-mysql-server) [(none)]>nopager
PAGER set to stdout
(root@yayun-mysql-server) [(none)]>select (6403945555 - 6377275259) / 1024 / 1024 as MB_per_min;
+-------------+
| MB_per_min |
+-------------+
| 25.43477631 |
+-------------+
1 row in set (0.02 sec) (root@yayun-mysql-server) [(none)]>

注意Log sequence number,这是写入事务日志的总字节数。所以,现在你可以看到每分钟有多少MB日志写入(这里的技术适用于所有版本的MySQL,在5.0及更高版本,你可以从SHOW GLOBAL STATUS的输出看Innodb_os_log_written的值) 。

通过计算后得到每分钟有25M的日志写入。

根据经验法则。通常我们设置redo log size足够大,能够容纳1个小时的日志写入量。

1小时日志写入量=25M * 60=1500M,大约等于1.5G。由于默认有两个日志重做日志文件ib_logfile0和ib_logfile1。在日志组中的每个重做日志文件的大小一致,并以循环的方式写入。innodb存储引擎先写重做日志文件0,当达到文件的最后时,会切换到重做日志1,并checkpoint。以此循环。

所以我们可以大约设置innodb_log_file_size=800M。注意:在innodb1.2.x版本之前,重做日志文件总的大小不得大于等于4G,而1.2.x版本将该限制扩大到了521G。

innodb_log_file_size = 800M
[root@yayun-mysql-server mysql]# du -sh ib_logfile*
801M ib_logfile0
801M ib_logfile1
[root@yayun-mysql-server mysql]#

对于innodb 1.2.x版本之前如果设置大于4G则报错

[root@yayun-mysql-server mysql]# tail -n  yayun-mysql-server.err
:: InnoDB: Completed initialization of buffer pool
:: InnoDB: Error: combined size of log files must be < GB
:: [ERROR] Plugin 'InnoDB' init function returned error.
:: [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
:: [ERROR] Failed to initialize plugins.
:: [ERROR] Aborting :: [Note] /usr/local/mysql/bin/mysqld: Shutdown complete :: mysqld_safe mysqld from pid file /data/mysql/yayun-mysql-server.pid ended
[root@yayun-mysql-server mysql]#

而innodb 1.2.x以后版本则不会:

[root@yayun-mysql-server mysql5.]# tail -f yayun-mysql-server.err
-- :: [Note] InnoDB: Using Linux native AIO
-- :: [Note] InnoDB: Initializing buffer pool, size = 128.0M
-- :: [Note] InnoDB: Completed initialization of buffer pool
-- :: [Note] InnoDB: Highest supported file format is Barracuda.
-- :: [Warning] InnoDB: Resizing redo log from * to * pages, LSN=
-- :: [Warning] InnoDB: Starting to delete and rewrite log files.
-- :: [Note] InnoDB: Setting log file ./ib_logfile101 size to MB
InnoDB: Progress in MB:
-- :: [Note] InnoDB: Setting log file ./ib_logfile1 size to MB
InnoDB: Progress in MB:

参考资料

http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/

InnoDB log file 设置多大合适?的更多相关文章

  1. 1025InnoDB log file 设置多大合适

    转自 http://blog.csdn.net/langkeziju/article/details/51094289 数据库的东西,往往一个参数就牵涉N多知识点.所以简单的说一下.大家都知道inno ...

  2. 如何计算合适的InnoDB log file size

    原文链接:http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/ Pe ...

  3. JVM内存设置多大合适?Xmx和Xmn如何设置?

    JVM内存设置多大合适?Xmx和Xmn如何设置?   问题:新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢? 分析:依 ...

  4. innodb log file与binlog的区别在哪里?

    Q: innodb log file与binlog的区别在哪里?有人说1.mysql的innodb引擎实际上是包装了inno base存储引擎.而innodb log file是由 inno base ...

  5. How to calculate a good InnoDB log file size

    Peter wrote a post a while ago about choosing a good InnoDB log file size.  Not to pick on Peter, b ...

  6. innodb log file size 配置估算以及修改

    root@localhost:(none) 06:22:17>pager grep seq PAGER set to 'grep seq' root@localhost:(none) 06:30 ...

  7. mariadb:InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes

    mariadb 启动中 InnoDB: Error: log file ./ib_logfile0 is of different size 0 起因:线上正在运行的系统,因为需要调整性能,变更了my ...

  8. 报错问题:InnoDB: Error: log file ./ib_logfile0 is of different size

    InnoDB: Error: log file ./ib_logfile0 is of different size bytesInnoDB: than specified in the .cnf f ...

  9. InnoDB: Error: log file .\ib_logfile0 is of different size 0 10485760 bytes

    启动WAMP Server的时候报例如以下的错误: 140618 23:12:32 [Note] Plugin 'FEDERATED' is disabled. 140618 23:12:32 Inn ...

随机推荐

  1. 在IDEA中将项目部署到Tomcat的方法及两种模式的区别

    转自:https://www.jianshu.com/p/fb0ed26c35d5 1.添加tomcat服务器 点右上角编辑配置   编辑配置 点击左上角+选择tomcat服务器   添加tomcat ...

  2. 磨刀不误砍柴工——统一日志系统 Log4Net/ExceptionLess

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫必须注明原文地址:www.cnblogs.com/tdws . 一.   写在前面 本文Log4Net介绍了基础的方式,大数据量生产环境不能使用,中等 ...

  3. asp.net Identity 设置自定义登录

    添加Startup.Auth.cs public partial class Startup { // For more information on configuring authenticati ...

  4. 小程序渲染html的两种方法

    一.使用文档自带的原生API  rich-text, nodes属性直接绑定需要渲染的html内容即可,文档参见这里:https://developers.weixin.qq.com/miniprog ...

  5. [Localization] MobileNet with SSD

    先来一波各版本性能展览: Pre-trained Models Choose the right MobileNet model to fit your latency and size budget ...

  6. iOS开发之--cocopods相关问题及解决方法

    Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default 解决办法:删除工程中的 ...

  7. ios开发之--关于UIView的autoresizingMask属性的研究

    在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. enum { UIViewAutoresizi ...

  8. C语言程序设计--执行命令

    1.system函数 1.1函数原型 int system(char *command); 1.2解释 system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来 ...

  9. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验六:数码管模块

    实验六:数码管模块 有关数码管的驱动,想必读者已经学烂了 ... 不过,作为学习的新仪式,再烂的东西也要温故知新,不然学习就会不健全.黑金开发板上的数码管资源,由始至终都没有改变过,笔者因此由身怀念. ...

  10. ubuntu安装使用ffmpeg

    环境:ubuntu 12.04 LTS (1)到http://www.ffmpeg.org/download.html下载最新版ffmpeg 也可以用这个命令: git clone git://sou ...