分析断电时文件操作flush不能写入硬盘数据丢失问题

一般写文件时,为了确保程序退出时也能把文件写到硬盘,都要在程序中加flush强制把内存缓存写到硬盘中,但这个flush只对内存缓存起作用,当遇到突然断电,还是不能保证已经写到物理硬盘上了。

现象:比如写一个文本文件a.txt,程序调用了flush,用notepad直接打开文件a.txt,可以看到flush的内容已经写到a.txt了,然后关掉notepad切断电源,然后再同上电源开机打开a.txt,可能会发现flush的内容又没有了,但这种情况不是每次都出现,跟flush和断电的时间间隔有关系。

原因:flush只是强制把内存缓存写到硬盘中,不能保证真正写入物理硬盘,一般物理硬盘内部都有一定的磁盘缓存,当看到a.txt的flush内容时可能只是磁盘缓存。

解决办法:应该说没有完美的解决办法,如果把磁盘缓存关闭,会大大降低整个系统包括操作系统的运行效率。一般大型服务器使用磁盘阵列等存储设备时磁盘缓存会更大,根本不能关闭,所以他们是通过UPS等备用电源来保障不出现断电问题,即使真的完全断电,他们也没有办法,只能丢失增量部分数据;另外,对于普通客户端系统,可以考虑备份机制,最好用追加的方式写文件,不要对整个文件改写,这样即使断电也只丢失增量部分数据。

发表评论

邮箱地址不会被公开。