【问题标题】:SQLite database corruption on embbeded system嵌入式系统上的 SQLite 数据库损坏
【发布时间】:2014-11-06 20:22:05
【问题描述】:

当使用 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

如何防止数据库损坏?

如果不可行,我有什么选择,因为我不在乎丢失一些数据。

【问题讨论】:

    标签: c sqlite embedded-linux beagleboard beagleboneblack


    【解决方案1】:

    SQLite 允许在断电期间发生损坏,但仅限于正在写入的那些扇区。

    您使用的闪存芯片可能会损坏许多不相关的扇区。 这是无法检测到的;使用此硬件无法防止数据丢失。

    【讨论】:

    • 使用 ext3 分区解决了我的数据库损坏问题。但你说得对,闪存芯片也会破坏不相关的扇区。
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多