进程挂掉后,操作系统会如何处理没有 flush 的文件?

如果一个进程 write 文件了,但是在 flush 之前,进程就挂掉了。

那么操作系统会怎么处理 write 的文件呢?自动 flush?还是丢弃 write 的文件?

这个疑问来自看《高性能Mysql 第四版》,里面提到的

红圈圈内的

图片.png

为什么进程崩溃,不会丢失事务?这里只是调用了 c 语言的 write 但是没有 flush

关于这个问题,我先问了 chatGPT,它会只是 write 但是「进程挂了 && 没有 flush」 就丢数据

图片.png

但是我又看到一个文章: 7.2 进程写文件时,进程发生了崩溃,已写入的数据会丢失吗?

图片.png

因为进程在执行 write (使用缓冲 IO)系统调用的时候,实际上是将文件数据写到了内核的 page cache,它是文件系统中用于缓存文件数据的缓冲,所以即使进程崩溃了,文件数据还是保留在内核的 page cache,我们读数据的时候,也是从内核的 page cache 读取,因此还是依然读的进程崩溃前写入的数据。

所以我懵了

这个问题貌似和写入模式有关系,但是 mysql 不可能使用「直写模式」,都是带 buffer 写的吧

阅读 2.6k
1 个回答

文档好像是说会丢:
innodb_flush_log_at_trx_commit

With a setting of 0, logs are written and flushed to disk once per second. Transactions for which logs have not been flushed can be lost in a crash.

With a setting of 2, logs are written after each transaction commit and flushed to disk once per second. Transactions for which logs have not been flushed can be lost in a crash.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题