MySQl 事务提交时,会先存放与 log buffer 中,如果此时系统正好宕机了,会不会造成已提交的事务丢失呢?
- 当事务提交时,根据配置的参数 innodb_flush_log_at_trx_commit 来决定是否刷盘。
- 如果innodb_flush_log_at_trx_commit 参数配置为 0,表示事务提交时,不进行 redo log buffer 的刷盘操作;
- 如果配置为 1,表示事务提交时,会将此时事务所对应的 redo log 所在的 redo log block 从内存写入到磁盘,同时调用 fysnc,确保数据落入到磁盘;
- 如果配置为 2,表示只是将日志写入到操作系统的缓存,而不进行 fysnc 操作。(进程在向磁盘写入数据时,是先将数据写入到操作系统的缓存中:os cache,再调用 fsync 方法,才会将数据从 os cache 中刷新到磁盘上)
实际上要严格保证数据不丢失,必须得保证 innodb_flush_log_at_trx_commit 配置为 1。