我有一个很大的问题......我正在使用SQLite开发桌面应用程序但是在复制/粘贴过程中我失去了一个电源并且进程被终止,因此基础丢失了。但是,我找到了恢复它的方法,但是基础是加密的。当我尝试使用conn.Open();
打开连接时出现此错误。如果我尝试使用DB Browser for SQLite打开它,它会向我询问一个SQLCipher加密密码,这样我就会发现数据丢失了。
是否有默认密码? 为什么会发生这种情况以及如何防止它再次发生? 我能做什么 ?
提前致谢。
答案 0 :(得分: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;