Sqlite 數據庫損壞的恢復

SQlite database disk image is malformed

數據表的損壞,一般原因:
數據表在讀寫的時候,設備突然斷電、關機、軟件閃退等情況下會造成數據庫或表的損壞。


Sqlite3 導出損壞包中的數據

客戶的一張表中的數據丟失了,無法查看,一共35條附件數據


1、安裝 Sqlite3

安裝步驟,菜鳥教程

安裝成功


2、使用Sqlite 命令導出數據爲sql文件

  • dump 命令 導出爲 sql 文件

使用如下命令:

sqlite3 old.db .dump > newsfeed.sql

cmd 打開命令行,定位到數據庫文件夾,使用上述命令,dump 成sql



  • 用文本編輯器打開newsfeed.sql

把文件拉倒最後面,我們可以看到 ROLLBACK; -- due to errors
把ROLLBACK;改成COMMIT;


  • 用newsfeed.sql生成新的數據包

使用如下命令生成新的數據庫包
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 語句

  • 利用DBMS聯結新舊數據庫

  • 利用SQL語句插入數據

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章