損壞原因: http://www.sqlite.org/lockingv3.html#how_to_corrupt
檢查數(shù)據(jù)庫損壞情況
首先sqlite3 database_name進(jìn)入數(shù)據(jù)庫
然后運(yùn)行命令 PRAGMA integrity_check;
如果數(shù)據(jù)庫文件損壞就會報損壞的錯誤妒潭,如何數(shù)據(jù)庫文件是完好的就會顯示OK位仁。
SQlite database disk image is malformed
數(shù)據(jù)表的損壞论悴,一般原因:
數(shù)據(jù)表在讀寫的時候,設(shè)備突然斷電钦睡、關(guān)機(jī)蒂窒、軟件閃退等情況下會造成數(shù)據(jù)庫或表的損壞。
Sqlite3 導(dǎo)出損壞包中的數(shù)據(jù)
客戶的一張表中的數(shù)據(jù)丟失了荞怒,無法查看洒琢,一共35條附件數(shù)據(jù)
1、安裝 Sqlite3
安裝成功
2衰抑、使用Sqlite 命令導(dǎo)出數(shù)據(jù)為sql文件
- dump 命令 導(dǎo)出為 sql 文件
使用如下命令:
sqlite3 old.db .dump > newsfeed.sql
cmd 打開命令行,定位到數(shù)據(jù)庫文件夾荧嵌,使用上述命令呛踊,dump 成sql
- 用文本編輯器打開newsfeed.sql
把文件拉倒最后面,我們可以看到 ROLLBACK; -- due to errors
把ROLLBACK;改成COMMIT;
- 用newsfeed.sql生成新的數(shù)據(jù)包
使用如下命令生成新的數(shù)據(jù)庫包
sqlite3 new.db < newsfeed.sql
我們可以看到數(shù)據(jù)找回了31條
2啦撮、 加密結(jié)果庫的數(shù)據(jù)找回
客戶反饋軟件導(dǎo)出成果時出錯谭网,經(jīng)過對數(shù)據(jù)的排查發(fā)現(xiàn)是 WYHCFJ 這張表中的 數(shù)據(jù)有損壞。
用上面的相同的方法赃春,
1愉择、DB Browser 打開加密的數(shù)據(jù)庫
2、導(dǎo)出數(shù)據(jù)庫中的數(shù)據(jù)為sql文件
3、利用sqlit3 命令將 sql 文件重新生成db文件
4锥涕、打開重新生成的db ,發(fā)現(xiàn)附件表中有420條附件
最大ID是420衷戈,證明原庫中是從421開始出錯的
5、打開原始db层坠,我們從422開始查詢
可以看到從422開始殖妇,數(shù)據(jù)沒有錯誤,那么應(yīng)該就只有421這條數(shù)據(jù)是錯誤的窿春,我們驗(yàn)證下
6、在原始db中查詢421的數(shù)據(jù)
我們發(fā)現(xiàn)這條數(shù)據(jù)是錯誤的
7采盒、怎么跳過錯誤的數(shù)據(jù)旧乞,而將421之后的數(shù)據(jù)插入到新的庫中?
這里我聯(lián)結(jié)了新舊兩個數(shù)據(jù)庫磅氨,然后使用INSERT INTO SELECT 語句
-
利用DBMS聯(lián)結(jié)新舊數(shù)據(jù)庫
利用SQL語句插入數(shù)據(jù)
insert into WYHCFJ
select *
from hcjg00.WYHCFJ
where F_ID > 421
-
插入數(shù)據(jù)成功
將數(shù)據(jù)放回軟件尺栖,驗(yàn)證成功!問題解決烦租,排除掉了421的異常數(shù)據(jù)
3延赌、不可挽回的損壞
在數(shù)據(jù)恢復(fù)的時候,有時候會發(fā)現(xiàn)導(dǎo)出的 sql 文件的時候叉橱,會出現(xiàn)這樣的情況 file is not a database
這種情況我就木雞了.....
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
/**** ERROR: (26) file is not a database *****/
ROLLBACK; -- due to errors