运行某些SQL语句出错database disk image is malformed
说明SQLite的内部数据格式,已经损坏
sqlite> PRAGMA integrity_check;
*** in database main ***
Main freelist: 3 of 3 pages missing from overflow list starting at 0
排除磁盘空间不够的原因 修复步骤 $ sqlite3 backup.sqlite sqlite> .output “_temp.tmp” sqlite> .dump sqlite> .quit $ sqlite3 new.sqlite sqlite> .read “_temp.tmp” sqlite> .quit 就将错误的backup.sqlite修复为new.sqlite了
另一种更快的修复方法
$echo “.dump” | sqlite3 old.db | sqlite3 new.db
直接将 old.db 修复为 new.db
或者
sqlite3 newsfeed.db .dump > newsfeed.sql
sqlite3 newsfeed.db < newsfeed.sql
请参考 http://www.sqlite.org/faq.html#q21
http://www.sqlite.org/sqlite.html
PHP使用popen调用sqlite shell来实现修复
$handle = popen(“mv ../backup.sqlite bad.sqlite && sqlite3 bad.sqlite .dump | sqlite3 good.sqlite && mv good.sqlite ../backup.sqlite”,‘r’); $read = fread($handle,4096); echo $read; pclose($handle);
压缩
sqlite3 my.sqlite 'VACUUM;'
在网上找了很多资料,很多网友都提到这个问题是不可解决的,面对这个问题,只能作罢。
但我不甘心这么丢失数据,最最后找到了一个解决方法。经测试,原来数据,全部保住。
以下为原文。
http://www.sunnyu.com/?p=201
SQLite有一个很严重的缺点就是不提供Repair命令。 导致死亡提示database disk image is malformed 它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程中突然掉电等。 官方对产生原因的一些说明:http://www.sqlite.org/lockingv3.html#how_to_corrupt
sqlite my.sqlite3
sqlite>PRAGMA integrity_check;
获得提示
*** in database main ***
Page 1518: btreeInitPage() returns error code 11
On tree page 1566 cell 2: Child page depth differs
On tree page 1566 cell 3: Child page depth differs
SQL error: database disk image is malformed
可以尝试通过简单的导出导入方式对损坏的库文件作回复。 首先导出数据
sqlite3 my.sqlite3
sqlite>.output tmp.sql
sqlite>.dump
sqlite>.quit
再倒入到一个新库中
sqlite3 mynew.sqlite3
sqlite>.read tmp.sql
sqlite>.quit
这时新建的mynew.sqlite3一般可用。
作者:
火地晋
出处:
http://yelaiju.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|