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