一尘不染

使用 innodb_flush_log_at_trx_commit = 2 是否安全

mysql

我转身innodb_flush_log_at_trx_commit = 2,获得了非常快的写入速度。但是在生产网站中使用它安全吗?


阅读 60

收藏
2022-10-20

共1个答案

一尘不染

您最多可能会损失一秒钟的交易。默认值为 1,这有助于保持 InnoDB ACID Compliant

根据innodb_flush_log_at_trx_commit上的 MySQL 文档

如果 innodb_flush_log_at_trx_commit 的值为 0,则每秒一次将日志缓冲区写入日志文件,并对日志文件执行刷新到磁盘操作,但在事务提交时不执行任何操作。当值为 1(默认值)时,在每次事务提交时将日志缓冲区写入日志文件,并对日志文件执行刷新到磁盘操作。当值为 2 时,日志缓冲区会在每次提交时写入文件,但不会对其执行刷新到磁盘操作。但是,当值为 2 时,日志文件上的刷新也会每秒发生一次。请注意,由于进程调度问题,每秒一次的刷新并不能 100% 保证每秒发生一次。

完全符合 ACID 要求默认值 1。您可以通过将值设置为不同于 1 来获得更好的性能,但是您可能会在崩溃中丢失多达一秒的事务。值为 0 时,任何 mysqld 进程崩溃都可以擦除最后一秒的事务。值为 2 时,只有操作系统崩溃或断电才能擦除最后一秒的事务。无论值如何,InnoDB 的崩溃恢复都有效。

为了在使用 InnoDB 和事务的复制设置中获得最大可能的持久性和一致性,请在主服务器 my.cnf 文件中使用 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1。

警告

许多操作系统和一些磁盘硬件欺骗了刷新到磁盘操作。他们可能会告诉 mysqld 已经发生了刷新,即使它还没有发生。那么即使设置为 1,也不能保证事务的持久性,在最坏的情况下,断电甚至会损坏 InnoDB 数据库。在 SCSI 磁盘控制器或磁盘本身中使用电池支持的磁盘缓存可加快文件刷新速度,并使操作更安全。您还可以尝试使用 Unix 命令 hdparm 来禁用硬件缓存中磁盘写入的缓存,或使用特定于硬件供应商的一些其他命令。

基于此,1 以外的值会使 InnoDB 面临丢失 1 秒事务或事务提交数据的风险。

该文档还说使用sync_binlog=1.

根据sync_binlog上的MySQL文档

值 1 是最安全的选择,因为在发生崩溃时,您最多会从二进制日志中丢失一个语句或事务。然而,它也是最慢的选择(除非磁盘有电池支持的缓存,这使得同步非常快)。

您最安全的选择是

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

如果您不介意可能的数据丢失(最多 1 秒的价值),那么如果奖励(更快的写入速度)值得,您可以使用 0 或 2,风险自负。

2022-10-20