https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html
https://www.cndba.cn/hbhe0316/article/22631
https://www.cndba.cn/hbhe0316/article/22631
1、innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit:是 InnoDB 引擎特有的,ib_logfile的刷新方式( ib_logfile:记录的是redo log和undo log的信息)https://www.cndba.cn/hbhe0316/article/22631https://www.cndba.cn/hbhe0316/article/22631
取值:0/1/2
innodb_flush_log_at_trx_commit=0,表示每隔一秒把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。也就是说一秒之前的日志都保存在日志缓冲区,也就是内存上,如果机器宕掉,可能丢失1秒的事务数据。https://www.cndba.cn/hbhe0316/article/22631
innodb_flush_log_at_trx_commit=1,表示在每次事务提交的时候,都把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,数据库对IO的要求就非常高了,如果底层的硬件提供的IOPS比较差,那么MySQL数据库的并发很快就会由于硬件IO的问题而无法提升。https://www.cndba.cn/hbhe0316/article/22631
innodb_flush_log_at_trx_commit=2,表示在每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力)。https://www.cndba.cn/hbhe0316/article/22631https://www.cndba.cn/hbhe0316/article/22631
控制提交操作的严格ACID遵从性和在重新安排和批量执行与提交相关的I/O操作时可能实现的更高性能之间的平衡。您可以通过更改默认值来获得更好的性能,但这样可能会在崩溃时丢失事务。
为了完全符合ACID,需要将默认设置设置为1。在每次事务提交时将日志写入并刷新到磁盘。
如果设置为0,则每秒将日志写入磁盘并将其刷新一次。未刷新日志的事务可能会在崩溃中丢失。
如果设置为2,则在每次事务提交后写入日志,并每秒将日志刷新到磁盘一次。未刷新日志的事务可能会在崩溃中丢失。
对于设置0和2,不能100%保证每秒刷新一次。刷新可能由于DDL更改和其他InnoDB内部活动而更频繁地发生,这些活动导致日志被独立于innodb_flush_log_at_trx_commit设置而刷新,有时由于调度问题而不那么频繁地刷新。如果每秒钟刷新一次日志,那么在崩溃中可能会丢失一秒以内的事务。如果日志刷新的频率高于或低于每秒一次,那么可能丢失的事务数量也会相应变化。
日志刷新频率由innodb_flush_log_at_timeout控制,它允许您将日志刷新频率设置为N秒(其中N为1…2700,默认值为1)。然而,任何意外的mysqld进程退出都可能删除最多N秒的事务。
DDL变化和其他InnoDB内部活动会独立于innodb_flush_log_at_trx_commit设置刷新日志。
InnoDB崩溃恢复工作与innodb_flush_log_at_trx_commit设置无关。事务要么被完全应用,要么被完全删除。
在使用InnoDB和事务的复制设置中,为了持久性和一致性:
如果启用了二进制日志,设置sync_binlog=1。
总是设置innodb_flush_log_at_trx_comm=1https://www.cndba.cn/hbhe0316/article/22631https://www.cndba.cn/hbhe0316/article/22631
mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
1 row in set (0.00 sec)
[root@mysql57 logs]# cat /etc/my.cnf | grep -i innodb-flush-log-at-trx-commit
innodb-flush-log-at-trx-commit = 1
[root@mysql57 logs]# service mysqld restart
Shutting down MySQL.... SUCCESS!
Starting MySQL.. SUCCESS!
版权声明:本文为博主原创文章,未经博主允许不得转载。
MYSQL
版权归原作者 hbhe0316 所有, 如有侵权,请联系我们删除。