如何恢复损坏的SQLite3数据库



这是之前回答的帖子的后续问题:在Linux中是否有用于验证SQLite数据库的命令行实用程序?

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

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

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

感谢

UPDATE:现在有一个自动方法内置在SQLite中:.recover

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

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

然而,这并不总是可能的。

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

使用Sqlite 3.29.0,CLI中引入了一个新的.recover命令:

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

sqlite3 broken.db ".recover" | sqlite3 new.db

我有一个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/

我的方法类似,防止错误回滚脚本:

sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;( -- due to errors)*$|COMMIT;|g' | sqlite3 database.new

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

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

对于文件,最好使用.dump,然后使用文本编辑器删除有问题的行。在转储文件中搜索ERROR

我可以通过以下方式修复我的Chrome历史文件(这是一个sqlite3数据库文件):

sqlite3.exe History ".backup History-new"

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

.转储在我的情况下不起作用

file is encrypted or is not a database

起作用的是:

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

杂注writable_schema禁用了一些完整性检查,因此这两个命令也可以起到作用,保持数据库自定义:

PRAGMA writable_schema=ON;
VACUUM;

我通过这些步骤修复了由于缺少索引而导致的数据库损坏,它们对我来说很有效。

  1. DROP索引:sqlite删除索引命令

  2. 运行真空Sqlite真空命令

  3. 重新创建索引:Sqlite创建索引

这对我很有效:

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

打开命令提示。

键入以下内容:

sqlite3.exe

(按Enter键)

NAME_OF_YOUR_CORRUPTED_DATABASE>".dump"|sqlite3 new.db

(按回车键)

所有其他解决方案都不适用于我。

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

当我处理其中一个表时,我收到了"数据库磁盘映像格式错误"的错误消息,所以我运行了[PRAGMA integrity_check],返回

主自由列表:标题中的自由页面计数太小

在树第16198页单元格1:第14190页的第2次引用

第16988页从未使用

第46637页从未使用

索引indexname1 中缺少第4493行

索引indexname2 中缺少第4493行

索引indexname3 中缺少第4493行

我首先保存了带有坏索引的表的模式,这样我就可以重新创建那些索引。然后,我使用[drop index_]命令删除了indexname 1、2和3个索引。我将表一个接一个地导出到JSON文件,然后截断每个表。此时运行完整性检查是成功的。然后,我使用[create index_]命令将这三个索引添加回来,并从JSON文件导出中导入每个表的记录。运行完整性检查命令仍然返回"ok",所有记录都已恢复。

我甚至无法通过sql语句删除单个损坏的行,只能删除所有行,之后我用以下步骤修复了它。

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

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

在任何数据库浏览器工具中打开sqlite数据库。然后发出以下命令

vacuum;
REINDEX;

并保存更改。大多数情况下,这将解决错误。

相关内容

  • 没有找到相关文章

最新更新