我正在研究在ARM9上运行的嵌入式Linux。 文件系统是ext4类型(rw,sync,noatime,data = writeback) 我实现了一个以Write-Ahead-Loggin(WAL)模式写入/读取SQLite3数据库的进程,启用了unsync。当发生电量损失时,我有大约两秒的时间通过同步和检查数据库来保存所有数据。但是,我仍然看到有时数据库被破坏,这在我的情况下确实不好。
我想为我的目的编写一个新的数据库引擎,与SQLite类似,数据库将保存在一个文件中。但在这种情况下,我正在考虑将标题数据写入一个扇区,其余数据写入至少两个扇区之后,因此DB的大小会更大但是在写入数据时,它不会破坏标题保存索引等的文件。这样,只有最后一个数据会被破坏而不是所有文件,就像SQLite的行为一样。
我的问题是我的方法是否合适?
答案 0 :(得分:0)
您可以使用ping pong technique。
在乒乓技术中,您使用2个单独的文件,并交替写入一个和另一个。如果在最坏的情况下发生断电,您最多只有一个损坏的文件,您可以安全地使用另一个。在最好的情况下,它们都没有损坏,你可以继续使用最新版本。
如果使用散列函数或其他CRC方案,则很容易检测到损坏的文件
显然,这种方案不会使您免于写入缓存或其他可能在底层工作的磁盘缓存机制。
或者,您可以使用具有数据完整性保护功能的日志文件系统
请注意,乒乓和日记方案仅确保数据完整性。数据丢失仍可能发生。数据完整性和数据丢失是两件完全不同的事情