<> 系列一:你的innodb 日志缓冲安全吗?

弄清楚一样东西,我们需要知道它是什么,它是如何工作的,它有什么作用,它有哪些危害。这一系列,我将尽量按照这种思路来作说明。

Innodb 日志缓冲是什么?

  它是内存中具有固定大小的内存块。其大小由innodb_log_buffer_size参数设置。

  当每个事务提交后,相应的页数据会发生变化,按理说应该将缓冲池中相关的脏页同步到磁盘.idb文件中。但是对于数据库存储服务而言,这些都是随机IO,如果每一个事务commit后都同步到磁盘,这是无法想像的,它的性能会非常的低。因此,事务commit后,MySQL不立即将脏页同步到磁盘上,至于它真正同步的机制,这一章节,我们将不讨论。到这里,我想细心的人应该想到,问题出来了,不是立即同步到磁盘,那么就有丢失数据的可能,比如进程突然崩溃,断电等。所以,为了解决有可能丢失数据这种不可接受的情况,MySQL开发人员想到了一种解决办法:既然是由于担心随机IO会造成性能问题才不立即同步,那么是不是可以考虑用顺序IO来代替呢,不用必须同步到.idb文件,只要将相关修改保存到磁盘中某个文件就行了。即使出现进程突然崩溃,断电等情况,即使数据出现了丢失,也可以通过之前保存到磁盘的文件来恢复。

  上面提到的文件也就是日志文件,并且针对日志文件专门在内存中划一块内存用来提高写入日志文件的性能。这个就是Innodb 日志缓冲。

Innodb 日志缓冲是如何工作的?

  每个事务提交后,将相应脏页的物理更改情况写到日志缓冲,在缓冲写满,事务提交或每一秒钟,将日志缓冲的数据刷新到日志文件。这样就相当于间接完成了数据持久化。

Innodb 日志缓冲有什么作用?

  作用非常明显,为了增加写入性能,先把数据写入到缓冲中,再将缓冲中的数据刷新到磁盘中的日志文件。写入缓冲比直接写入到日志文件速度明显要快的多。毕竟一个是内存,一个是磁盘。

Innodb 日志缓冲有哪些危害?

  上面提到,在缓冲写满,事务提交或每一秒钟,将日志缓冲的数据写到日志文件。这个时候有人就要问了,日志缓冲中的数据不是也会发生丢失的情况吗?这样的话同样会造成数据丢失。是的,的确存在这种可能性。因此,有什么解决办法呢?有,有个innodb_log_at_trx_commit配置参数能够解决这个问题。

  innodb_log_at_trx_commit 可以设置为0,1,2。其意义各不相同.

  innodb_log_at_trx_commit =0,每一秒中将日志缓冲刷新到日志文件(真正写到日志文件,),事务提交不刷新。如果突然断电,就会有1秒中的数据丢失。

  innodb_log_at_trx_commit =1,事务提交后就将日志缓冲刷新到日志文件(真正写到日志文件),这样做最安全,不会丢失任何一个事务,同时对性能有影响。

  innodb_log_at_trx_commit =2,事务提交后就将日志缓冲刷新到日志文件(有可能这个时候只存在于操作系统缓存中),如果仅是进程崩溃不会丢失数据,但是如果日志服务器崩溃或者日志服务器断电,存在于操作系统缓存中的数据就没有真正写入到磁盘文件中,数据将会丢失。

总结: 

  如果需要保证数据的绝对安全,建议innodb_log_at_trx_commit =1. 同时,如果日志文件放在有后备电源并且分配有写入缓存的Raid上,设置为1并不会对性能有多大影响。并且经济上非常划算。

  

  

你可能感兴趣的:(InnoDB)