【问题标题】:SQLITE file is encrypted or is not a databaseSQLITE 文件已加密或不是数据库
【发布时间】:2017-05-24 14:42:50
【问题描述】:

我有一个大问题...我正在使用 SQLite 开发桌面应用程序,但在复制/粘贴过程中,我失去了电源并且进程被终止,因此基础丢失了。但是,我找到了一种恢复它的方法,但基础是加密的。当我尝试使用conn.Open(); 打开连接时,我收到此错误。如果我尝试使用 SQLite 的 DB Browser 打开它,它会询问我一个 SQLCipher 加密密码,所以它会告诉我数据丢失了..

有没有默认密码? 为什么会发生这种情况以及如何防止它再次发生? 我能做些什么 ?

提前致谢。

【问题讨论】:

  • 你真的加密了吗?如果不是,请看“或”后面的部分。
  • 我没有加密它。连接字符串为 m_dbConnection = new SQLiteConnection("Data Source=Baza.sqlite;Version=3;Read Only=False;Journal Mode=Off");它工作得很好,直到它被删除。我按名称找到它,它说那是 sqlite 文件。它没有 sens.. 它是一个数据库,没有加密,但不知何故被加密了
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Unix & Linux Stack ExchangeDatabase Administrators Stack Exchange 会是一个更好的提问地点。

标签: sqlite


【解决方案1】:

好的,终于找到了一个可行的解决方案,所以如果有人遇到和我一样的麻烦,请发布答案..

首先,使用好的恢复软件。为了修复数据库,我找到了 3 个无需备份即可工作的解决方案:

  1. 使用 DB 浏览器打开损坏的数据库并将数据库导出到 SQL。随心所欲地命名它。然后,创建新数据库并从 SQL 导入数据库。
  2. 有修复损坏数据库的软件。下载一个并用它来修复数据库。
  3. 从 sqlite.org 下载“sqlite3”并在命令行中导航到解压“sqlite3”的文件夹。然后尝试使用 .dump 转储整个数据库,并使用这些命令创建一个新数据库:

    sqlite3 corrupt_table_name.sqlite ".dump" | sqlite3 new.sqlite
    

【讨论】:

    【解决方案2】:

    同时检查 您“连接”的 SQLite 版本是否与数据库文件版本一致

    例如,这是一个由 SQLite 版本 3+ 编写的 DB 文件:

    $ file foobar.db 
    foobar.db: SQLite 3.x database, last written using SQLite version 3027002
    

    这里我也有 2 个版本的 sqlite:

    $ sqlite -version
    2.8.17
    $ sqlite3 -version
    3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0alt1
    

    显然事后看来,使用 sqlite 版本 2 打开 foobar.db 将失败,并产生相同的错误消息:

    $ sqlite foobar.db 
    Unable to open database "foobar.db": file is encrypted or is not a database
    

    但正确的版本一切都很好:

    $ sqlite3 foobar.db
    SQLite version 3.27.2 2019-02-25 16:06:06
    Enter ".help" for usage hints.
    sqlite> 
    sqlite> .databases 
    main: /tmp/foobar.db
    sqlite> 
    

    错误消息是一个包罗万象的信息,仅表示文件格式未被识别。

    【讨论】:

      【解决方案3】:

      当我尝试访问另一个系统中的数据库转储时,与获得它的位置相比,我遇到了同样的错误。当我尝试在开发机器上打开时,它在这个线程中抛出了报告的错误:

      $ sqlite3 db_dump.sqlite .tables
      Error: file is encrypted or is not a database
      

      事实证明,这是由于这些系统之间的 sqlite 版本存在差异。此开发系统版本为 3.6.20。

      生产系统上的版本是 3.8.9。一旦我将 sqlite3 升级到相同的版本,我就可以访问它的所有数据。我只是在下面显示表格按预期显示:

      # sqlite3 -version
      3.8.9
      # sqlite3 db_dump.sqlite .tables
      capture               diskio                transport     
      consumer              filters               processes              
      

      不过,这个错误一开始就颇具误导性。

      【讨论】:

        【解决方案4】:

        如果您在指定journal_mode = WAL 时与数据库进行了交互,然后尝试从不支持WAL (

        As noted in the SQLite documentation under Backwards Compatibility,要解决此问题而无需重新创建数据库,请将日志模式显式设置为 DELETE

        PRAGMA journal_mode=DELETE;
        

        【讨论】:

          【解决方案5】:

          您的数据库未加密(这只是错误消息中的两个选项之一)。

          您的数据恢复工具没有恢复正确的数据;您在文件中的内容是其他内容。

          您必须从备份中恢复数据库文件。

          【讨论】:

          • 我尝试了两种不同的恢复工具(其中一种是微软官方建议的)并找到了 3 个相同的数据库(数据库名称是“Baza”,所以我 100% 确定它是数据库并且是SQLite 文件)。尝试了所有这些,但我得到了同样的错误......但是,你还有其他想法如何备份它吗?
          • SQLite 数据库刚刚归档;您可以制作副本(当它们未打开时)。
          • 对不起,你完全正确。似乎数据库已损坏。经过 2 天的研究结果如下: - 使用 DB SQLite 浏览器打开数据库 -> 错误消息:文件已加密或不是数据库。 - 我与 Zetetic 支持人员(SQLCipher 开发人员)取得了联系 - 答案是数据库本身不可能加密。 - 尝试使用命令行和 sqlite3 打开数据库:相同的错误消息。 - 尝试使用 XVI32 HEX 编辑器打开它。另外,打开了几个运行良好的数据库,发现标题有很大差异。
          • -当我尝试使用“sqlite3_analyzer”运行它时,我收到一条消息:“数据库磁盘映像格式错误你知道如何恢复数据库吗?如果我用记事本++打开它没有可读格式,出现奇怪字符。
          • 正如我所说,您必须从备份中恢复它。 (效果如何取决于您有多少备份……)
          【解决方案6】:

          在我的情况下,问题在于 sqlcipher 版本升级,每当我更新我的 pod 时,它会自动升级 sqlcipher 并发生错误。

          为了快速修复,只需手动添加 SDK 而不是 Pod 安装。对于适当的解决方案,请使用此链接GitHub Solution

          【讨论】:

            猜你喜欢
            • 2014-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-03
            • 1970-01-01
            相关资源
            最近更新 更多