Sqlite 数据库损坏的恢复

2019-04-21  本文已影响0人  沐左

损坏原因: http://www.sqlite.org/lockingv3.html#how_to_corrupt

检查数据库损坏情况

首先sqlite3 database_name进入数据库
然后运行命令 PRAGMA integrity_check;
如果数据库文件损坏就会报损坏的错误,如何数据库文件是完好的就会显示OK。


SQlite database disk image is malformed

数据表的损坏,一般原因:
数据表在读写的时候,设备突然断电、关机、软件闪退等情况下会造成数据库或表的损坏。


Sqlite3 导出损坏包中的数据

客户的一张表中的数据丢失了,无法查看,一共35条附件数据



1、安装 Sqlite3

安装步骤,菜鸟教程

安装成功



2、使用Sqlite 命令导出数据为sql文件

使用如下命令:

sqlite3 old.db .dump > newsfeed.sql

cmd 打开命令行,定位到数据库文件夹,使用上述命令,dump 成sql


把文件拉倒最后面,我们可以看到 ROLLBACK; -- due to errors

把ROLLBACK;改成COMMIT;


使用如下命令生成新的数据库包

sqlite3 new.db < newsfeed.sql

我们可以看到数据找回了31条


2、 加密结果库的数据找回

客户反馈软件导出成果时出错,经过对数据的排查发现是 WYHCFJ 这张表中的 数据有损坏。

用上面的相同的方法,

1、DB Browser 打开加密的数据库

2、导出数据库中的数据为sql文件


3、利用sqlit3 命令将 sql 文件重新生成db文件


4、打开重新生成的db ,发现附件表中有420条附件


最大ID是420,证明原库中是从421开始出错的

5、打开原始db,我们从422开始查询


可以看到从422开始,数据没有错误,那么应该就只有421这条数据是错误的,我们验证下

6、在原始db中查询421的数据


我们发现这条数据是错误的

7、怎么跳过错误的数据,而将421之后的数据插入到新的库中?

这里我联结了新旧两个数据库,然后使用INSERT INTO SELECT 语句

insert into WYHCFJ
select * 
from hcjg00.WYHCFJ
where F_ID > 421

将数据放回软件,验证成功!问题解决,排除掉了421的异常数据


3、不可挽回的损坏

在数据恢复的时候,有时候会发现导出的 sql 文件的时候,会出现这样的情况 file is not a database
这种情况我就木鸡了.....

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
/**** ERROR: (26) file is not a database *****/
ROLLBACK; -- due to errors
上一篇 下一篇

猜你喜欢

热点阅读