1

我正在研究在 ARM9 上运行的嵌入式 linux。文件系统是 ext4 类型(rw、sync、noatime、data=writeback)我实现了一个进程,该进程以 Write-Ahead-Loggin (WAL) 模式写入/读取 SQLite3 数据库,并启用了 unsync。发生断电时,我有大约两秒钟的时间通过同步和检查数据库来保存所有数据。但是,我仍然看到有时数据库被损坏,这在我的情况下真的不好。

我想为我的目的编写一个新的数据库引擎,以类似于 SQLite 的方式,数据库将保存在一个文件中。但是在这种情况下,我正在考虑将标头数据写入一个扇区,其余数据至少在两个扇区之后,因此数据库的大小会更大但是在写入数据时,它不会破坏标头文件,它包含索引等。这样,只有最后的数据会被破坏,而不是所有的文件,因为 SQLite 的行为。

我的问题是我的方法是否正确?

4

1 回答 1

0

你可以使用乒乓球技术

在乒乓球技术中,您使用 2 个单独的文件并交替写入一个和另一个。如果在最坏的情况下发生断电,您最多有 1 个损坏的文件,您可以安全地使用另一个。在最好的情况下,它们都没有损坏,您可以继续使用最新的。

如果您使用散列函数或其他 CRC 方案,很容易检测到损坏的文件

显然,这种方案不会让您摆脱可能在后台工作的写入缓存或其他磁盘缓存机制。

或者,您可以使用具有自身数据完整性保护功能的日志文件系统

请注意,乒乓和日志方案仅确保数据完整性。数据丢失仍然可能发生。数据完整性和数据丢失是两个完全不同的东西

于 2014-09-17T10:10:09.700 回答