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聯結新舊資料庫
Sqlite 資料庫損壞的恢複 - 利用SQL語句插入資料
insert into WYHCFJ
select *
from hcjg00.WYHCFJ
where F_ID > 421
- 插入資料成功
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