lin*_*sek 57 database sqlite recovery corruption
这是以前回答的帖子的后续问题:是否有用于在Linux中验证SQLite数据库的命令行实用程序?
如果数据库产生以下错误:
$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed
Run Code Online (Sandbox Code Playgroud)
是否有任何清理处理可以将数据库恢复到可用状态?即使有可能丢失一些腐败记录?
谢谢
CL.*_*CL. 104
如果有任何自动方法,SQLite已经能够做到.
有时,损坏只是或主要在索引中,在这种情况下,可以通过尝试转储整个数据库来获取一些或大多数记录.dump,并使用这些命令来创建新数据库:
$ sqlite3 mydata.db ".dump" | sqlite3 new.db
Run Code Online (Sandbox Code Playgroud)
但是,这并不总是可行的.
最简单,最可靠的方法是从备份中恢复数据库文件.
aru*_*run 35
在Sqlite 3.29.0.recover中,CLI 引入了一个新命令:
添加“.recover”命令,该命令尝试从损坏的数据库文件中恢复尽可能多的内容。
sqlite3 broken.db ".recover" | sqlite3 new.db
Run Code Online (Sandbox Code Playgroud)
joh*_*chd 18
我有一个腐败的sqlite文件,会显示这样的症状.
select count(*) from corruptTable;
return:38000;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试加载记录时
select * from corruptTable;
Run Code Online (Sandbox Code Playgroud)
它只会返回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
Run Code Online (Sandbox Code Playgroud)
这些步骤来自本网站:http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/
Sta*_*r00 10
如果数据库严重损坏,.dump则会包含错误,并且某些数据可能会丢失.
对于更复杂的数据模式,这将意味着可能使应用程序混淆的孤立和/或部分记录.
可能最好.dump是文件,然后使用文本编辑器删除有问题的行.ERROR在转储文件中搜索.
我能够通过这种方式修复我的Chrome历史文件(这是一个sqlite3数据库文件):
sqlite3.exe History ".backup History-new"
Run Code Online (Sandbox Code Playgroud)
pragmawritable_schema禁用了一些完整性检查,因此这两个命令也可以达到目的,保持数据库自定义:
PRAGMA writable_schema=ON;
VACUUM;
Run Code Online (Sandbox Code Playgroud)
小智 6
我的方法很相似,可以防止错误回滚脚本:
sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 database.new
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这是一个老问题,但是我仍然想分享我的解决方案。我的问题是kodi(xbmc)的sqlite3数据库已损坏。
.dump在我的情况下不起作用
file is encrypted or is not a database
起作用的是以下内容: