这是先前回答的帖子的后续问题:在Linux中是否有用于验证SQLite数据库的命令行实用程序?
如果数据库产生以下错误:
$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed
是否可以执行任何清理处理以将数据库恢复到可用状态?即使可能丢失一些损坏的记录?
谢谢
这是先前回答的帖子的后续问题:在Linux中是否有用于验证SQLite数据库的命令行实用程序?
如果数据库产生以下错误:
$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed
是否可以执行任何清理处理以将数据库恢复到可用状态?即使可能丢失一些损坏的记录?
谢谢
Answers:
更新:现在有一个自动方法内置到SQLite中:.recover
有时,损坏仅或主要发生在索引中,在这种情况下,可以通过尝试使用来转储整个数据库.dump
并使用这些命令来创建新数据库来获取部分或大部分记录:
$ sqlite3 mydata.db ".dump" | sqlite3 new.db
但是,这并不总是可能的。
最简单,最可靠的方法是从备份中还原数据库文件。
sqlite3 mydata.db ".dump" > db_script.sql
您将获得一个SQL脚本,您可以对其进行编辑,并确保最后没有像ROLLBACK这样的陌生内容。然后,您可以使用sqlite3 recovered.db < db_script.sql
对于Sqlite 3.29.0.recover
,CLI引入了一个新命令:
添加“ .recover”命令,该命令尝试从损坏的数据库文件中恢复尽可能多的内容。
sqlite3 broken.db ".recover" | sqlite3 new.db
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/
我可以通过以下方式修复我的Chrome历史记录文件(这是sqlite3数据库文件):
sqlite3.exe History ".backup History-new"
我知道这是一个老问题,但是我仍然想分享我的解决方案。我的问题是kodi(xbmc)的sqlite3数据库已损坏。
.dump在我的情况下不起作用
file is encrypted or is not a database
起作用的是以下内容:
.dump
/ .repair
,以确保文件具有完整的完整性。
编译指示writable_schema
禁用某些完整性检查,因此这两个命令也可以解决问题,从而使数据库自定义保持在适当的位置:
PRAGMA writable_schema=ON;
VACUUM;
这为我工作:
从此处下载sqlite3工具包,并将其放在任何文件夹中。将损坏的数据库放在同一文件夹中。
打开命令提示符。
输入以下内容:
sqlite3.exe
(按Enter)
NAME_OF_YOUR_CORRUPTED_DATABASE>“ .dump” | sqlite3 new.db
(按Enter)
所有其他解决方案都不适用于我。
我已修复由于这些步骤导致的索引丢失而导致的数据库损坏,它们对我有用。
DROP索引: sqlite drop index命令
运行真空 Sqlite vacuum命令
再次重新创建索引:Sqlite创建索引
以下修复程序可以在不运行任何命令行工具的情况下修复我的数据库。
当我使用其中一个表时,出现“数据库磁盘映像格式错误”错误消息,因此我运行了[PRAGMA完整性_检查],该返回
主空闲列表:标题中的空闲页面数太少
在第16198页的树上的单元格1:第14190页的第二次引用
从未使用过的页面16988
从未使用过的页面46637
索引indexname1中缺少第4493行
索引indexname2中缺少第4493行
索引indexname3中缺少第4493行
我首先用错误的索引保存了表的架构,以便重新创建这些索引。然后,我使用[drop index _]命令删除了索引名称1、2和3的索引。我将表一一导出到JSON文件,然后将每个表都截断。此时运行完整性检查已成功。然后,我使用[create index _]命令重新添加了三个索引,并从其JSON文件导出中导入了每个表的记录。运行完整性检查命令仍返回“ ok”,并还原所有记录。