【问题标题】:Can I deliberately corrupt an sqlite3 database for testing?我可以故意破坏 sqlite3 数据库进行测试吗?
【发布时间】:2014-11-17 06:37:44
【问题描述】:

我正在 Android 手机上运行一个小而重要的应用程序。它使用 sqlite 数据库作为其主要数据存储。经过一年多近乎完美的运行后,由于臭名昭著的“数据库磁盘映像格式错误”问题,它在几天前突然在临界点崩溃。这引起了一些尴尬,因为我在几个小时内都无法访问系统来修复它。

我知道这种情况应该是very rare。但是我现在正在编写一些代码以更优雅地从这种情况中恢复,因为我不能让它再次发生(这可能是由于手机的硬件,在这种情况下它现在可能开始发生更多经常 - 但我再次承受不起崩溃)。

但是,为了测试我的恢复代码,我需要生成相同的错误,并且由于一个愚蠢的错误,我丢失了导致问题的数据库副本。

我的问题是 - 我可以对 sqlite 数据库做些什么来导致“数据库磁盘映像格式错误”错误?然后我可以测试我的恢复代码。

【问题讨论】:

    标签: android python sqlite


    【解决方案1】:

    SQLite 文档有一篇名为 How To Corrupt an SQLite Database File 的文章

    SQLite 数据库文件是普通的磁盘文件。这意味着任何 进程可以打开文件并用垃圾覆盖它。有 SQLite 库对此无能为力。

    如果你把垃圾数据写入文件,我猜你可以达到你想要的效果

    【讨论】:

    • 啊哈,我没想到这么明显。我会试试看,我想知道它是否会产生格式错误或其他什么。
    • @ShankarG 我自己没试过。我刚刚粘贴了文章中最可能的原因:)
    • 非常基本的问题——在linux系统中,你如何只改变文件中的一些字节? dd 覆盖文件。
    【解决方案2】:

    你可以做到的。

    1. 只需将您的工作数据库文件复制到资产中。
    2. 然后一旦应用程序运行,通过代码逐字节复制数据库文件并在复制时丢弃一些字节,您将得到一个损坏的数据库。

    你也可以试试别的:

    只需创建一个文本文件。然后将其重命名为 *.db 文件并尝试在 android 中打开该文件,假设它是一个数据库文件。我希望你会得到同样的例外。

    【讨论】:

    • 我尝试了文本文件的事情 - 它产生了一个稍微不同的错误(“文件被加密或不是数据库”)。
    • @ShankarG,好吧,那就试试第一种方法吧。
    • 第一种方法使用几行 python 代码 - 读取文件,然后逐字节输出,但忽略 1000 位的随机样本。到目前为止,五次尝试中的五次都会生成“磁盘映像格式错误”错误。
    • 快乐的破坏... :)
    • 愿意发布您用来破坏数据库的代码吗?我遗漏了随机字节,仍然得到文件被加密或不是数据库。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多