重庆思庄Oracle、Redhat认证学习论坛
标题: MysqL 磁盘写入策略之innodb_flush_log_at_trx_commit [打印本页]
作者: jiawang 时间: 2024-9-20 12:01
标题: MysqL 磁盘写入策略之innodb_flush_log_at_trx_commit
本帖最后由 jiawang 于 2024-9-20 12:01 编辑
innodb_flush_log_at_trx_commit=0,表示每隔一秒把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。也就是说一秒之前的日志都保存在日志缓冲区,也就是内存上,如果机器崩溃,可能丢失1秒的事务数据,性能相比其后面的快点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据,例如高并发写的日志服务器,设为0来获得更高性能。
innodb_flush_log_at_trx_commit=1,表示在每次事务提交的时候,都把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,数据库对IO的要求就非常高。
innodb_flush_log_at_trx_commit=2,表示在每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘,日志仍然会每秒flush到硬盘。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力)。