如何恢复损坏的SQLite3数据库?

时间:2013-08-15 18:57:48

标签: database sqlite corruption recovery

这是以前回复的帖子的后续问题:Is there a command line utility for validating SQLite databases in Linux?

如果数据库产生以下错误:

$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed

是否可以执行任何清理处理以将数据库恢复到可用状态?即使可能丢失一些腐败记录?

由于

13 个答案:

答案 0 :(得分:97)

如果有任何自动方法,SQLite已经能够做到。

有时,损坏只是或主要在索引中,在这种情况下,可以通过尝试使用.dump转储整个数据库来获取一些或大多数记录,并使用这些命令创建新数据库:

$ sqlite3 mydata.db ".dump" | sqlite3 new.db

然而,这并非总是可行。

最简单,最可靠的方法是从备份中恢复数据库文件。

答案 1 :(得分:15)

我有一个腐败的sqlite文件会显示这样的症状。

select count(*) from corruptTable;
return:38000;

但是当我尝试用

加载记录时
select * from corruptTable;

它只会返回7条记录。

我尝试了几件事,但这些步骤最为成功。

在Mac上,打开终端并在损坏的数据库上运行这些命令。 (这些是sqlite3命令,因此您应该能够在其他系统中使用其他sqlite3编辑器或类似命令。)

1 sqlite3 dbWithCorruptTable.sqlite (Obviously replace "dbWithCorruptTable" to your sqlite3 file that has the corrupt table)
2 .mode insert
3 .output dump_all.sql
4 .dump
5 .exit
6 Manually edit the dump_all.sql file in a text editor and remove the transaction statements. Usually there is a "BEGIN TRANSACTION" statement on the 2nd line of the file and a "ROLLBACK" statement on the last line. Remove these and save the file

这些步骤取自本网站: http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/

答案 2 :(得分:9)

如果数据库严重损坏,.dump将包含错误,并且某些数据可能会丢失。

对于更复杂的数据模式,这将意味着可能会混淆应用程序的孤立和/或部分记录。

对文件.dump可能更为可取,然后使用文本编辑器删除有问题的行。在转储文件中搜索ERROR

答案 3 :(得分:7)

我能够通过这种方式修复我的Chrome历史记录文件(这是一个sqlite3数据库文件):

sqlite3.exe History ".backup History-new"

答案 4 :(得分:4)

我知道这是一个老问题,但我仍想分享我的解决方案。 我的问题是kodi(xbmc)的sqlite3数据库已损坏。

.dump在我的情况下不起作用

file is encrypted or is not a database

以下是有效的:

  1. 备份旧的db文件
  2. 让kodi创建一个新的db文件
  3. this网站上查看了sqlite文件的标题格式
  4. 使用十六进制编辑器(祝福)打开这两个文件并检查前96个字节
  5. 前两个字节不同,所以我将前40个字节从新的db文件复制到旧的db文件
  6. 执行此操作后,我的数据库文件再次运行!!!

答案 5 :(得分:3)

通过Sqlite 3.29.0,新的.recover命令已引入CLI:

  

添加“ .recover”命令,该命令尝试恢复的内容与   可能来自损坏的数据库文件。

答案 6 :(得分:2)

我的方法很相似,可以防止错误回滚脚本:

sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;$|COMMIT;|g' | sqlite3 database.new

答案 7 :(得分:1)

这对我有用:

here下载sqlite3工具包并将其放入任何文件夹。将损坏的数据库放在同一个文件夹中。

打开命令提示符。

输入以下内容:

sqlite3.exe

(按Enter键)

NAME_OF_YOUR_CORRUPTED_DATABASE> “.dump”| sqlite3 new.db

(按回车键)

所有其他解决方案对我都不起作用。

答案 8 :(得分:1)

pragma Select publisher.Email From book Inner join publisher on publisher.name = book.publisher 禁用了一些完整性检查,因此这两个命令也可以解决问题,从而保持数据库自定义:

writable_schema

答案 9 :(得分:0)

以下修复程序可以在不运行任何命令行工具的情况下修复我的数据库。

当我使用其中一个表时,我收到“数据库磁盘映像格式错误”错误消息,因此我运行了[PRAGMA integrity_check]返回

主要空闲列表:标题中的空闲页数太小

在树页面16198单元格1:对页面14190的第二个参考

永远不会使用页面16988

永远不会使用页面46637

索引indexname1

中缺少第4493行

索引indexname2缺少第4493行

索引indexname3缺少第4493行

我首先使用坏索引保存了表的模式,以便重新创建这些索引。然后,我使用[drop index _]命令删除了索引名1,2和3索引。我将我的表逐个导出到JSON文件,然后截断每个表。此时运行完整性检查是成功的。然后我使用[create index _]命令添加了三个索引,并从其JSON文件导出中导入了每个表的记录。运行完整性检查命令仍然返回“ok”并恢复所有记录。

答案 10 :(得分:0)

通过这些步骤,我已修复了由于缺少索引而导致的数据库损坏,并且它们对我有用。

  1. DROP索引:sqlite drop index command

  2. 运行真空Sqlite vacuum command

  3. 再次重新创建索引:Sqlite create index

答案 11 :(得分:0)

我什至无法通过sql语句仅删除所有损坏的行,然后通过以下步骤对其进行了修复。

  1. 使用sqlite browser和PRAGMA完整性检查打开* .db;指示损坏的表。
  2. 通过sqlite浏览器将此表导出为csv
  3. 删除表中的所有内容。从[表名]
  4. 删除
  5. 使用sqlite浏览器导入csv,然后在导入设置中选择->高级->冲突策略->忽略行
  6. 那之后我的完整性检查还可以

答案 12 :(得分:0)

如果来自 PRAGMA integrity_check 的错误类似于“索引 sqlite_autoindex_XXX 中缺少行 NNN”,您可以使用命令 REINDEX 修复索引。