c++ - 避免数据损坏的文件结构

标签 c++ delphi data-integrity integrity

我目前正在为监控系统开发我们当前的媒体存储(存储视频/音频/元数据)的升级,并且我正在重新设计记录结构以获得更强大的解决方案。

我需要为存储在数据文件中的数据创建一些索引数据,所以我创建了一个索引文件结构,但我担心硬盘故障(想象一下如果在写入索引期间断电文件,它将损坏,因为数据很可能已写入一半)。 我已经设计了索引的存储方式,但我担心的是电源故障或磁盘故障时的数据损坏

那么,有谁知道在写入时避免数据损坏的技术吗?

我已经进行了一些搜索,但没有找到好的解决方案,一个解决方案是创建一个写入文件的所有内容的日志,但这样一来我每秒就会有更多的 I/O(我关心的是数量每秒 I/O 的数量,系统也应尽可能执行最少的操作)。

我想到的是复制索引文件中的敏感数据以及时间戳和校验和字段。例如:

Field1 Field2 Field3 时间戳校验和

Field1 Field2 Field3 时间戳校验和

因此,我将数据写入了两次,如果当我读取文件时,第一组字段已损坏(校验和不匹配),我的第二组字段应该没问题。我相信如果在中间停止写入时会发生损坏,例如,当软件写入第一组字段和电源故障时,第二组仍然完好无损......如果电源故障而第二正在写入一组,第一个已经完好无损。

你们觉得这个解决方案怎么样?它能避免数据损坏吗?

顺便说一句,由于部署具有事务性 NTFS 的系统的限制,我不能将任何类型的数据库用于此类存储或事务性 NTFS

欢迎任何想法,谢谢!

最佳答案

忽略你问题中关于不能使用数据库的部分:)

您可能会对 SQL Server 2012 的 FileTable 感兴趣。您可以将文件存储在数据库外部的文件夹中,但仍然可以像访问数据库内部一样访问这些文件。您可以使用数据库将新文件插入该目录或简单地将文件复制到文件夹中。您的数据库不会因视频文件而变得非常庞大。如果数据库服务器软件出现故障,它们也将无法访问。您的帧索引可以是单独的 .jpg 文件(或其他文件),并且这些文件也可以通过外键由 FileTable 和索引引用到主视频文件。帧索引表就非常简单了。

因此,您消除了写入文件和维护日志以查看是否存在故障的 DB 开销。如果操作系统由于电源故障而无法写入文件,那么数据库将没有机会。您可以进行目录比较,并使用强大的实用程序来移动文件,并且在写入的任何部分失败时不删除源文件。

关于c++ - 避免数据损坏的文件结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10195476/

相关文章:

c++ - 语义规则的编译时执行

c++ - 获取字符串的最后 9 个字符

c++ - 如何覆盖 C++ 标准库类函数?

ios - Delphi XE4 iOS无法连接PAServer

mysql - 时间表工具的数据库规范化并确保数据完整性

c++ - OTL 和 SOCI 的区别

algorithm - 有什么简单的方法可以测试两个 PNG 是否相等?

mysql - Delphi 2010和Dbexpress部署

mongodb - 采用 NOSQL 方法时数据完整性的重要性?

git - 如何验证 git merge 不包含额外的更改?