SQLITE文件已加密或不是数据库

时间:2017-05-24 14:42:51

标签: sqlite

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

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

提前致谢。

6 个答案:

答案 0 :(得分:2)

好的,终于找到了一个有效的解决方案,如果有人遇到与我一样的麻烦,可以发布答案。

首先,使用好的恢复软件。为了修复数据库,我找到了3个没有备份的解决方案:

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

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

答案 1 :(得分:2)

还要检查您正在“连接”的 SQLite 版本是否与数据库文件版本一致

例如,这是 SQLite 3+ 版本编写的数据库文件:

$ 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> 

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

答案 2 :(得分:0)

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

您的数据恢复工具无法恢复正确的数据;你在文件中的内容是别的。

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

答案 3 :(得分:0)

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

要快速修复,只需手动添加SDK而不是Pod安装。要获得正确的解决方案,请使用此链接GitHub Solution

答案 4 :(得分:0)

与尝试获取数据库转储相比,尝试在另一个系统中访问数据库转储时出现相同的错误。当我尝试在开发机上打开时,它在此线程中引发了报告的错误:

$ 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              

不过,此错误一开始会引起误解。

答案 5 :(得分:0)

如果您在指定 journal_mode = WAL 的某个时间点与数据库进行了交互,然后尝试从不支持 WAL (< v3.7.0) 的客户端使用数据库,则此错误也可能出现。

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

PRAGMA journal_mode=DELETE;