sqlite数据库损坏的恢复 sqlite datebase disk image is malformed

平板电脑会用到一个下载小说的爬虫软件,它会使用sqlite存放数据。我把数据存放目录选择在内存卡上,过了一年,出现了软件里找不到下载记录的情况,检查了一下目录,发现是数据库文件损坏了。1.3gb大小的数据库文件(主要内容是小说的文本)。我怀疑损坏的主要原因还是内存卡垃圾,是自然的损毁。闪迪256gb的内存卡,售价229元,1gb价格不到1元,可能平板供电也有问题,或者安卓系统的孱弱性,总之我在pc平台没有碰到过这类问题,而且我用dump的方法,把数据提取出来,发现因为错误,只提取了130mb,相比原来的1.3gb,缩水了很多。

在网上搜索,发现主要的解决方法,还是dump出sql语句,然后重新建库。这也提醒我们数据库要做好备份了,网上也搜不到什么别的解决方案了。想想也是,如果官方有方便的方法的话,网上肯定都是类似的回答。

我去官网查了一下,文档fsq里面,有提到

What is an SQLITE_CORRUPT error? What does it mean for the database to be "malformed"? Why am I getting this error?

An SQLITE_CORRUPT error is returned when SQLite detects an error in the structure, format, or other control elements of the database file.

SQLite does not corrupt database files without external help. If your application crashes in the middle of an update, your data is safe. The database is safe even if your OS crashes or takes a power loss. The crash-resistance of SQLite has been extensively studied and tested and is attested by years of real-world experience by billions of users.

That said, there are a number of things that external programs or bugs in your hardware or OS can do to corrupt a database file. See How To Corrupt An SQLite Database File for further information.

You can use PRAGMA integrity_check to do a thorough but time intensive test of the database integrity.

You can use PRAGMA quick_check to do a faster but less thorough test of the database integrity.

Depending how badly your database is corrupted, you may be able to recover some of the data by using the CLI to dump the schema and contents to a file and then recreate. Unfortunately, once humpty-dumpty falls off the wall, it is generally not possible to put him back together again.

官方认为sqlite的安全性还是很不错的,应用程序崩溃不会损坏数据库文件,所以说硬件问题的可能性更大吧,可能就是普通的数据损坏。

01.首先使用 PRAGMA integrity_check;进行完整性检查

我检查的结果,报了一长串的错误。可见很多内容都损坏了,尤其是我在数据库gui中看到,有一行本该是正数的栏里面的数据都是很大的负数,可见数据确实损坏了。

02.把数据库dump为sql

执行这一步的时候,我dump出来的数据最后一行是ROLLBACK(due to error),注意把这一行改成COMMIT,这样就能抢救一部分数据了。

# 在命令行界面打开旧的数据库
sqlite3 oldfile.db
# 指定输出文件
.output dump.sql
# 执行dump
.dump

03.读取sql到新的数据库

# 创建一个新数据库并打开
sqlite3 newfile.db
# 读取之前创建的sql并执行
.read dump.sql

结果是大部分数据丢失了,但是好在表结构还在,小说列表还完整,关键就是这个列表,我相信这个数据还在,爬虫软件应该能借着重新把小说全部爬出来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355