MySQL 学习篇(二)——IO相关配置参数 3

  • 前言

全面介绍了内存配置的相关信息,让我们再来看一下另一类对Mysql性能和数据库数据的安全性都有很大影响的配置参数。

  • Mysql服务器参数

  1. I/O相关配置参数

这部分参数的决定了如何同步缓存中的数据到磁盘上,以进行数据修改持久化的保存,这些操作对性能的影响都非常大,如果要保证数据修改后,立即写入到磁盘上,那是一个很昂贵的操作。

前面我们介绍过,I/O操作的成本都是很高的,所以我们就要在性能和安全性上做一些平衡,有时候我们为了提高性能,就不得不牺牲一些安全性,由于I/O配置总是和我们所选择的存储引擎相关的。

所以我们在这里分不同的存储引擎来给大家介绍一下相关的参数,主要的还是介绍InnoDB、MyISAM两种存储引擎的相关配置。

  • InnoDB I/O相关配置

问:InnoDB存储引擎关于I/O相关配置参数有哪些?

答:innodb_log_file_sizeinnodb_log_files_in_group,这两个参数决定了InnoDB事务日志,也就是说redo log的大小和数量。

我们知道InnoDB是一种是事务型的存储引擎,为了减少提交事务时产生的I/O开销,InnoDB写日志的方式就是在事务提交的时候,先写入事务日志中,而不是每次把修改后的数据刷新到数据文件中,这样做的是为了提高I/O的性能,因为事务的修改,使数据和索引文件通常都会映射到表空间的随机的位置,所以能刷新数据变更到数据文件,就会产生大量的随机I/O,而记录日志所需要的是顺序的I/O,所以相比于刷新脏数据到数据文件系统来说,记录事务日志的方法要快得多。

一旦事务日志的安全写入到磁盘中,事物就算是持久化了,因为即使数据变更还没有写到数据文件,如果这时候能发生了服务器宕机,这样的情况,我们还是可以使用事务日志来恢复已经提交的事务。

innodb_log_file_size:控制了单个事务日志的大小

innodb_log_files_in_group:控制着事务日志文件的个数

事务日志的总大小就是为两者相乘,事务日志是循环使用的,写满一个之后才会使用下一个。

所以以前有一个说法,多建立几个事务日志文件,这样的可以并发写入,以获得更好的II/O性能,这样的做法现在看来是没有任何意义的。所以在配置时我们可以不用innodb_log_files_in_group这个参数,只要修改单个日志文件的大小就可以了,至于单个日志文件的大小,这就和我们的业务情况有关系了,如果业务非常繁忙,则建议把日志文件的设置等相对大一些是有好处的,一般情况下来说呢,事务日志的总大小应该可以记录服务器一小时左右的事务的信息,事务日志并不是每次都直接写到日志文件中,而是先写到事务日志的缓冲区,然后再刷新到磁盘中。

变量innodb_log_buffer_size:对于控制支持缓冲区的大小,通常不需要把日志缓冲区设置的非常大,因为在一般情况下,我们在一秒钟就会进行事务日志缓存的刷新,所以这个缓冲期至少能够保留一秒中的事务就已经足够了,32兆到128兆这样的配置就已经是可以了,相对于事务日志缓冲区来说,创新事务日志的频繁程度对性能影响可能会更大一些。

innodb_flush_log_at_trx_commit:刷新事务日志的频繁程度

1:这个设置的是最安全的设置,同时也是我们的MySql默认配置,能保证不会丢失任何的已经提交的事务,除非磁盘或者是操作系统,做了一种伪刷新,这个值虽然安全性很高,但是性能的也是最差的。

问:0和2的区别在于?

答:如果MySQL的进程崩溃了,设置为2不会丢失任何的事务,只有在整个服务器宕机时,才可能丢失至少一秒的事务,所以建议大家把这个参数设置为二。

问:事务日志从缓存刷新到磁盘的步骤?

答:要先从Mysql事务日志缓冲区刷新到操作磁盘的cache,这实际上还是在内存中,只有当第二步从操作系统的cache刷新到磁盘日志文件时,才算真正的完成了这种事务的持久化。

innodb_flush_method :这个参数决定了InnoDB数据文件和日志文件如何跟我讲系统进行交互,这个参数不仅会影响你的InnoDB怎么写数据,同时也会影响InnoDB怎么读取数据,对于Linux系统建议把这个设置成O_DIRECT,这个设置会通知操作系统,不要缓存数据,也不要预读,也就是说这个选项完全关闭了操作性能缓存,并且使所有读和写的都直接通过存储设备来完成,避免了InnoDB和操作系统对于数据的双重缓存;

innodb_file_per_table:主要是控制InnoDB如何使用表空间。

如果设置了这个参数,InnoDB会为每个表建立一个单独的表空间,否则就会把所有与InnoDB表的数据量存储到系统表空间中,这里强烈建议大家使用这个参数;

innodb_double_write:控制InnoDB如是否使用双写缓存。

双写缓冲主要作用是避免没有写完整导致的数据损坏,InnoDB一个页的默认大小事16k,而当系统崩溃或者BUG造成了一个磁盘写操作不能完整的完成,这种不完整的页写入就有可能会发生,会造成16K数据呢不完整的写到数据文件中。

这时数据文件就会损坏,而双写缓存就是为了避免发生这样的情况,所以建议大家使用双写缓存,增加数据的安全性,这虽然会对性能有一些影响,但是对性能的影响并不会太大,和数据的安全性相比还是可以接受的。

除了InnoDB存储引擎,MyISAM也是一种常用的存储引擎,更主要的是目前MySQL的系统表还在使用MyISAM存储引擎,所以呢我们对于MyISAM来如何进行I/O配置也要进行了解:

  • MyISAM I/O相关配置

修复是repair table命令

 

猜你喜欢

转载自blog.csdn.net/Sicily_winner/article/details/87748565