天天看点

Sqlite 数据库损坏的恢复

SQlite database disk image is malformed
           

数据表的损坏,一般原因:

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

Sqlite3 导出损坏包中的数据

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

Sqlite 数据库损坏的恢复

1、安装 Sqlite3

安装步骤,菜鸟教程

Sqlite 数据库损坏的恢复

安装成功

Sqlite 数据库损坏的恢复

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

  • dump 命令 导出为 sql 文件

使用如下命令:

sqlite3 old.db .dump > newsfeed.sql
           

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

Sqlite 数据库损坏的恢复
Sqlite 数据库损坏的恢复
  • 用文本编辑器打开newsfeed.sql
Sqlite 数据库损坏的恢复

把文件拉倒最后面,我们可以看到

ROLLBACK; -- due to errors

把ROLLBACK;改成COMMIT;

Sqlite 数据库损坏的恢复
  • 用newsfeed.sql生成新的数据包

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

sqlite3 new.db < newsfeed.sql

Sqlite 数据库损坏的恢复
Sqlite 数据库损坏的恢复
Sqlite 数据库损坏的恢复

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

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

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

Sqlite 数据库损坏的恢复

用上面的相同的方法,

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

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

Sqlite 数据库损坏的恢复

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

Sqlite 数据库损坏的恢复

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

Sqlite 数据库损坏的恢复

最大ID是420,证明原库中是从421开始出错的5、打开原始db,我们从422开始查询

Sqlite 数据库损坏的恢复

可以看到从422开始,数据没有错误,那么应该就只有421这条数据是错误的,我们验证下6、在原始db中查询421的数据

Sqlite 数据库损坏的恢复

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

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

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

  • 利用DBMS联结新旧数据库
    Sqlite 数据库损坏的恢复
  • 利用SQL语句插入数据
insert into WYHCFJ
select * 
from hcjg00.WYHCFJ
where F_ID > 421
           
Sqlite 数据库损坏的恢复
  • 插入数据成功
    Sqlite 数据库损坏的恢复

将数据放回软件,验证成功!问题解决,排除掉了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
           

继续阅读