当使用eMMC在beaglebone嵌入式Linux系统上发生断电时,我正在测试SQLite数据库的完整性。
我用
配置了数据库PRAGMA synchronous = FULL
PRAGMA journal_mode = WAL
并在继电器切断电源时继续写入数据库。测试会自动运行几个小时。
过了一会儿,数据库被破坏,出现以下错误:
integrity_check:***数据库主要*** 页面50861:btreeInitPage()返回错误代码11 在树页面50820上,单元格83:子页面深度不同 页面50862:btreeInitPage()返回错误代码11 页面50863:btreeInitPage()返回错误代码11 页面50864:btreeInitPage()返回错误代码11 页面50865:btreeInitPage()返回错误代码11 页面50866:btreeInitPage()返回错误代码11 页面50867:btreeInitPage()返回错误代码11 页面50868:btreeInitPage()返回错误代码11 页面50869:btreeInitPage()返回错误代码11 页面50870:btreeInitPage()返回错误代码11 页面50871:btreeInitPage()返回错误代码11 页面50872:btreeInitPage()返回错误代码11 页面50873:btreeInitPage()返回错误代码11 在树页面50820单元格96:子页面深度不同
我已阅读以下关于SQLite的文章:
https://www.sqlite.org/howtocorrupt.html
https://www.sqlite.org/atomiccommit.html
如何防止数据库损坏?
如果它不可行,我有什么选择,因为我不关心丢失一些数据。
答案 0 :(得分:1)
SQLite允许在断电期间出现损坏,但仅限于正在写入的扇区。
您正在使用的闪存芯片可能会破坏许多不相关的扇区。 这是不可能检测到的;使用此硬件无法防止数据丢失。