MySQL写磁盘速度慢(设置参数innodb_flush_log_at_trx_commit和sync_binlog)

mysql> select @@innodb_flush_log_at_trx_commit;

+----------------------------------+

| @@innodb_flush_log_at_trx_commit |

+----------------------------------+

|                                1 |

+----------------------------------+

1 row in set (0.00 sec)

 

mysql的innodb_flush_log_at_trx_commit参数

该参数提交事务的时候将 redo 日志写入磁盘

该参数有效值为:0,1,2

扫描二维码关注公众号,回复: 13595246 查看本文章

 

设置为0:该模式速度最快,但不太安全。mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。提交事务的时候,不立即把 redo log buffer 里的数据刷入磁盘文件的,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。此时可能你提交事务了,结果 mysql 宕机了,然后此时内存里的数据全部丢失。

设置为1:系统默认值,该模式是最安全的, 但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。提交事务的时候,就必须把 redo log 从内存刷入到磁盘文件里去,只要事务提交成功,那么 redo log 就必然在磁盘里了。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。只有1才能真正地保证事务的持久性,但是由于刷新操作 fsync() 是阻塞的,直到完成后才返回,我们知道写磁盘的速度是很慢的,因此 MySQL 的性能会明显地下降。如果不在乎事务丢失,0和2能获得更高的性能。
设置为2:系统推荐值,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。提交事务的时候,把 redo 日志写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘文件,可能 1 秒后才会把 os cache 里的数据写入到磁盘文件里去。

 

mysql配置文件mysql.ini,修改成合适的值,然后重启mysql即可生效

 

 

mysql> select @@sync_binlog;

+---------------+

| @@sync_binlog |

+---------------+

|             1 |

+---------------+

1 row in set (0.00 sec)

 

mysql>

sync_binlog参数

该参数控制着二进制日志写入磁盘的过程。

该参数的有效值为0 、1、N:

设置为0:默认值。事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制日志。

设置为1:事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。

设置为N:每写N次操作系统缓冲就执行一次刷新操作。

将这个参数设为1以上的数值会提高数据库的性能,但同时会伴随数据丢失的风险。
二进制日志文件涉及到数据的恢复,以及想在主从之间获得最大的一致性,那么应该将该参数设置为1,但同时也会造成一定的性能损耗。

猜你喜欢

转载自blog.csdn.net/songpeiying/article/details/109637396