天天看點

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
           

繼續閱讀