过去几个月,我们一直在将数据丢失为延迟写入错误。我遇到了自定义代码和收缩包装应用程序的错误。例如,下面的错误消息来自Visual Studio 2008构建解决方案
Windows - 延迟写入失败:Windows无法执行 保存文件的所有数据 \命门\来源\其它\ OCHSHP \ Done07 \ LHFTInstaller \发布\ LHFAI.CAB。该 数据已丢失。此错误可能是由您的失败引起的 计算机硬件或网络连接。请尝试保存此文件 别处。
例如,当它出现在Adobe,Visual Studio或Word中时,不会造成任何伤害。主要问题是我们的自定义应用程序(直接C应用程序将dBase文件中的数据写入网络共享)。
从程序的角度来看,写入成功。它删除源数据,然后继续下一条记录。几分钟后,Windows弹出一条错误消息,指出发生延迟写入并且数据丢失。
我的问题是,我们可以做些什么来 帮助 我们的网络/服务器团队隔离并纠正问题(阅读,说服他们问题是真的。只是告诉他们很多次都没有说服他们)你对我们如何编写以避免数据丢失有任何建议吗?
答案 0 :(得分:3)
与任何现代操作系统一样,Windows上的写入实际上不会发送到磁盘,直到操作系统到达它。这是一个很大的性能获胜,但问题(正如您所发现的)是您在写入时无法检测到错误。
执行异步写入的每个操作系统还提供将数据强制到磁盘的机制。在Windows上,FlushFileBuffers或_commit功能可以解决问题。 (一个用于HANDLE
s,另一个用于文件描述符。)
请注意,必须检查每个磁盘写入的返回值,和这些同步函数的返回值,以确保将数据写入磁盘。另请注意,这些功能会阻止并等待数据到达磁盘 - 即使您正在写入网络服务器 - 因此它们可能会很慢。在真正需要将数据推送到稳定存储之前,请不要打电话给他们。
有关详情,请参阅fsync() Across Platforms。
答案 1 :(得分:1)
您的文件系统已损坏或硬盘出现故障。网络/服务器团队应扫描磁盘以修复前者并检测后者。还要检查错误日志,看它是否告诉你任何事情。如果错误日志指示无法写入硬件,则需要更换磁盘。