SQLiteDoctor(sqlite數(shù)據(jù)庫(kù)修復(fù)工具)
v1.4.1 官方免費(fèi)版- 軟件大?。?span itemprop="fileSize">16.30 MB
- 軟件語(yǔ)言:中文
- 軟件類型:國(guó)產(chǎn)軟件 / 數(shù)據(jù)恢復(fù)
- 軟件授權(quán): 免費(fèi)軟件
- 更新時(shí)間:2019-07-15 13:14:03
- 軟件等級(jí):
- 軟件廠商: -
- 應(yīng)用平臺(tái):WinXP, Win7, Win10
- 軟件官網(wǎng): http://ygkjgt7.cn/
相關(guān)軟件
010 Editor(16進(jìn)制編輯器)v12.0.1 中文版
26.16 MB/中文/10.0
Pathman Mastersv1.01 安卓版
3.01 MB/中文/10.0
.NET版本檢測(cè)工具(.NET Version Detector)v17R1b 綠色版
459.00 KB/英文/10.0
星芒效果PS濾鏡StarFilter Prov2020.2.06 漢化免費(fèi)版
6.02 MB/中文/10.0
SQLite數(shù)據(jù)庫(kù)管理(Navicat for SQLite)v15.0.23 企業(yè)注冊(cè)版
57.98 MB/中文/10.0
軟件介紹人氣軟件精品推薦相關(guān)文章網(wǎng)友評(píng)論下載地址
SQLiteDoctor是專為救生員用戶打造的一款救生員sqlite數(shù)據(jù)庫(kù)修復(fù)工具,可以幫助用戶快速高效的進(jìn)行sqlite數(shù)據(jù)恢復(fù),還能夠查詢數(shù)據(jù)內(nèi)所有的word表格數(shù)據(jù)值,非常的方便高效,是救生員用戶必備的救生sqlite數(shù)據(jù)恢復(fù)助手軟件,歡迎感興趣的用戶快來(lái)it貓撲網(wǎng)下載體驗(yàn)吧!
官方介紹
一個(gè)基于sqlite數(shù)據(jù)庫(kù)引擎構(gòu)建的功能齊全的高性能關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。自2013年以來(lái),cubeSQL已經(jīng)部署了超過(guò)8400萬(wàn)次。
SQLiteDoctor已被公認(rèn)為sqlite數(shù)據(jù)庫(kù)取證分析DFRWS 2018 Europe的最佳工具之一。
SQLiteDoctor軟件使用功能
易于使用的向?qū)?/strong>
要開(kāi)始,只需選擇要恢復(fù)的sqlite數(shù)據(jù)庫(kù)和輸出數(shù)據(jù)庫(kù)文件。如果損壞的數(shù)據(jù)庫(kù)已加密,您可以選擇設(shè)置加密密鑰。
SQLiteDoctor支持所有標(biāo)準(zhǔn)的SEE sqlite加密:AES128,AES192和AES256。
表格面板
掃描數(shù)據(jù)庫(kù)以查找所有表和所有rowid值。如果無(wú)法找到特定表的最大RowID值,則使用N / A值,您可以手動(dòng)將該值設(shè)置為高于您知道在該數(shù)據(jù)庫(kù)中為該表使用的最大rowid值的數(shù)值(如果不是輸入的值超過(guò)使用的默認(rèn)值100000)。
詳細(xì)日志
恢復(fù)開(kāi)始后,會(huì)生成詳細(xì)的日志輸出,以便讓您了解當(dāng)前執(zhí)行的步驟。如果出現(xiàn)不可恢復(fù)的錯(cuò)誤,將顯示紅色消息(帶有總錯(cuò)誤計(jì)數(shù)標(biāo)簽)。
相關(guān)說(shuō)明
SQLite數(shù)據(jù)庫(kù)對(duì)腐敗具有很強(qiáng)的抵抗力。如果應(yīng)用程序崩潰,操作系統(tǒng)崩潰,甚至在事務(wù)中發(fā)生電源故障,則部分寫(xiě)入的事務(wù)應(yīng)在下次訪問(wèn)數(shù)據(jù)庫(kù)文件時(shí)自動(dòng)回滾。
雖然SQLite可以抵抗數(shù)據(jù)庫(kù)損壞,但它并不是免疫的,在某些情況下,需要一個(gè)像SQLiteDoctor這樣的特殊工具才能完全恢復(fù)損壞的sqlite數(shù)據(jù)庫(kù)。
要求
MacOS 10.10.5或更高版本
Windows 7SP1 / 8.1 / 10或更高版本
如何破壞sqlite數(shù)據(jù)庫(kù)
SQLite數(shù)據(jù)庫(kù)對(duì)腐敗具有很強(qiáng)的抵抗力。如果應(yīng)用程序崩潰,操作系統(tǒng)崩潰,甚至在事務(wù)中發(fā)生電源故障,則部分寫(xiě)入的事務(wù)應(yīng)在下次訪問(wèn)數(shù)據(jù)庫(kù)文件時(shí)自動(dòng)回滾?;謴?fù)過(guò)程是完全自動(dòng)的,不需要用戶或應(yīng)用程序的任何操作。雖然SQLite可以抵御數(shù)據(jù)庫(kù)損壞,但它并不是免疫的。本文檔描述了SQLite數(shù)據(jù)庫(kù)可能損壞的各種方法。
1.文件被流氓線程或進(jìn)程覆蓋
SQLite數(shù)據(jù)庫(kù)文件是普通的磁盤(pán)文件。這意味著任何進(jìn)程都可以打開(kāi)文件并用垃圾覆蓋它。SQLite庫(kù)沒(méi)有什么能夠防范這種情況。
1.1。關(guān)閉后繼續(xù)使用文件描述符
我們已經(jīng)看到多個(gè)文件描述符在文件上打開(kāi)的情況,然后該文件描述符被關(guān)閉并在SQLite數(shù)據(jù)庫(kù)上重新打開(kāi)。后來(lái),其他一些線程繼續(xù)寫(xiě)入舊文件描述符,沒(méi)有意識(shí)到原始文件已經(jīng)關(guān)閉。但是因?yàn)镾QLite重新打開(kāi)了文件描述符,所以打算進(jìn)入原始文件的信息最終會(huì)覆蓋部分SQLite數(shù)據(jù)庫(kù),從而導(dǎo)致數(shù)據(jù)庫(kù)損壞。
其中一個(gè)例子發(fā)生在大約2013-08-30,在Fossil DVCS的規(guī)范存儲(chǔ)庫(kù)中。在那種情況下,文件描述符2(標(biāo)準(zhǔn)錯(cuò)誤)在sqlite3_open_v2()之前被錯(cuò)誤地關(guān)閉(我們懷疑 是 stunnel ),因此用于存儲(chǔ)庫(kù)數(shù)據(jù)庫(kù)文件的文件描述符是2.稍后,應(yīng)用程序錯(cuò)誤導(dǎo)致斷言( )通過(guò)調(diào)用write(2,...)發(fā)出錯(cuò)誤消息的語(yǔ)句。但由于文件描述符2現(xiàn)在已連接到數(shù)據(jù)庫(kù)文件,因此錯(cuò)誤消息覆蓋了數(shù)據(jù)庫(kù)的一部分。為防止出現(xiàn)此類問(wèn)題,SQLite 版本3.8.1(2013-10-17)及以后拒絕對(duì)數(shù)據(jù)庫(kù)文件使用低編號(hào)文件描述符。(請(qǐng)參閱SQLITE_MINIMUM_FILE_DESCRIPTOR 了解更多信息。)
Facebook工程師在2014-08-12的博客文章中報(bào)告了使用封閉文件描述符導(dǎo)致?lián)p壞的另一個(gè)例子 。
1.2。事務(wù)處于活動(dòng)狀態(tài)時(shí)備份或還原
在后臺(tái)運(yùn)行自動(dòng)備份的系統(tǒng)可能會(huì)嘗試在事務(wù)處理過(guò)程中制作SQLite數(shù)據(jù)庫(kù)文件的備份副本。然后,備份副本可能包含一些舊內(nèi)容和一些新內(nèi)容,因此會(huì)損壞。
制作SQLite數(shù)據(jù)庫(kù)的可靠備份副本的最佳方法是使用作為SQLite庫(kù)一部分的備份API。如果不這樣做,只要任何進(jìn)程沒(méi)有正在進(jìn)行的事務(wù),就可以安全地復(fù)制SQLite數(shù)據(jù)庫(kù)文件。如果先前的事務(wù)失敗,那么將任何回滾日志(* -journal文件)或預(yù)寫(xiě)日志(* -wal文件)與數(shù)據(jù)庫(kù)文件本身一起復(fù)制是很重要的。
1.3。刪除熱門(mén)日記
SQLite通常將所有內(nèi)容存儲(chǔ)在單個(gè)磁盤(pán)文件中。但是,在執(zhí)行事務(wù)時(shí),在崩潰或電源故障后恢復(fù)數(shù)據(jù)庫(kù)所需的信息存儲(chǔ)在輔助日志文件中。這種日志文件被描述為“熱門(mén)”。日志文件與原始數(shù)據(jù)庫(kù)文件具有相同的名稱,并添加了-journal或-wal后綴。
SQLite必須查看日志文件才能從崩潰或電源故障中恢復(fù)。如果在崩潰或電源故障后移動(dòng),刪除或重命名熱日志文件,則自動(dòng)恢復(fù)將不起作用,并且數(shù)據(jù)庫(kù)可能會(huì)損壞。
此問(wèn)題的另一個(gè)表現(xiàn)是 由于使用不一致的8 + 3文件名而導(dǎo)致的數(shù)據(jù)庫(kù)損壞。
1.4。錯(cuò)誤配對(duì)數(shù)據(jù)庫(kù)文件和熱門(mén)期刊
前面的示例是更一般問(wèn)題的特定情況:SQLite數(shù)據(jù)庫(kù)的狀態(tài)由數(shù)據(jù)庫(kù)文件和日志文件控制。在靜止?fàn)顟B(tài)下,日志文件不存在,只有數(shù)據(jù)庫(kù)文件才對(duì)。但是,如果日志文件確實(shí)存在,則必須將其與數(shù)據(jù)庫(kù)保持在一起以避免損壞。以下行為都可能導(dǎo)致腐敗:
在兩個(gè)不同的數(shù)據(jù)庫(kù)之間交換日志文件。
使用不同的日志文件覆蓋日志文件。
將日志文件從一個(gè)數(shù)據(jù)庫(kù)移動(dòng)到另一個(gè)數(shù)據(jù)庫(kù)
復(fù)制數(shù)據(jù)庫(kù)文件而不復(fù)制其日志。
用另一個(gè)數(shù)據(jù)覆蓋數(shù)據(jù)庫(kù)文件而不刪除與原始數(shù)據(jù)庫(kù)關(guān)聯(lián)的任何熱日志。
2.文件鎖定問(wèn)題
SQLite在數(shù)據(jù)庫(kù)文件和預(yù)寫(xiě)日志或WAL文件上使用文件鎖 來(lái)協(xié)調(diào)并發(fā)進(jìn)程之間的訪問(wèn)。如果沒(méi)有協(xié)調(diào),兩個(gè)線程或進(jìn)程可能會(huì)嘗試同時(shí)對(duì)數(shù)據(jù)庫(kù)文件進(jìn)行不兼容的更改,從而導(dǎo)致數(shù)據(jù)庫(kù)損壞。
2.1。鎖實(shí)現(xiàn)損壞或丟失的文件系統(tǒng)
SQLite依賴于底層文件系統(tǒng)來(lái)進(jìn)行鎖定,正如文檔所說(shuō)的那樣。但是一些文件系統(tǒng)在其鎖定邏輯中包含錯(cuò)誤,因此鎖定并不總是像宣傳的那樣。特別是網(wǎng)絡(luò)文件系統(tǒng)和NFS尤其如此。如果在鎖定原語(yǔ)包含錯(cuò)誤的文件系統(tǒng)上使用SQLite,并且如果兩個(gè)或多個(gè)線程或進(jìn)程同時(shí)嘗試訪問(wèn)同一數(shù)據(jù)庫(kù),則可能導(dǎo)致數(shù)據(jù)庫(kù)損壞。
2.2。Posix咨詢鎖由一個(gè)單獨(dú)的線程取消close()
SQLite在unix平臺(tái)上使用的默認(rèn)鎖定機(jī)制是POSIX咨詢鎖定。不幸的是,POSIX咨詢鎖定具有設(shè)計(jì)怪癖,使其容易被濫用和失敗。特別是,同一進(jìn)程中具有持有POSIX顧問(wèn)鎖的文件描述符的任何線程都可以使用不同的文件描述符覆蓋該鎖。一個(gè)特別有害的問(wèn)題是close()系統(tǒng)調(diào)用將取消所有線程和進(jìn)程中所有文件描述符的同一文件上的所有POSIX顧問(wèn)鎖。
因此,例如,假設(shè)一個(gè)多線程進(jìn)程有兩個(gè)或多個(gè)線程,它們與同一個(gè)數(shù)據(jù)庫(kù)文件有不同的SQLite數(shù)據(jù)庫(kù)連接。然后出現(xiàn)第三個(gè)線程,并希望自己從同一個(gè)數(shù)據(jù)庫(kù)文件中讀取內(nèi)容,而不使用SQLite庫(kù)。第三個(gè)線程執(zhí)行open(),read()然后close()。人們會(huì)認(rèn)為這將是無(wú)害的。但是關(guān)閉()系統(tǒng)調(diào)用導(dǎo)致所有其他線程刪除數(shù)據(jù)庫(kù)中的鎖。那些其他線程無(wú)法知道他們的鎖剛剛被破壞(POSIX沒(méi)有提供任何機(jī)制來(lái)確定這一點(diǎn)),所以他們繼續(xù)運(yùn)行,假設(shè)他們的鎖仍然有效。這可能導(dǎo)致兩個(gè)或多個(gè)線程或進(jìn)程同時(shí)嘗試寫(xiě)入數(shù)據(jù)庫(kù),從而導(dǎo)致數(shù)據(jù)庫(kù)損壞。
請(qǐng)注意,兩個(gè)或多個(gè)線程使用SQLite庫(kù)訪問(wèn)同一SQLite數(shù)據(jù)庫(kù)文件是完全安全的。SQLite的unix驅(qū)動(dòng)程序知道POSIX咨詢鎖定怪癖并解決它們。只有當(dāng)線程試圖繞過(guò)SQLite庫(kù)并直接讀取數(shù)據(jù)庫(kù)文件時(shí),才會(huì)出現(xiàn)此問(wèn)題。
2.2.1。SQLite的多個(gè)副本鏈接到同一個(gè)應(yīng)用程序
正如前一段所指出的,SQLite采取措施解決POSIX顧問(wèn)鎖定的怪癖。部分解決方法涉及保持開(kāi)放SQLite數(shù)據(jù)庫(kù)文件的全局列表(互斥保護(hù))。但是,如果SQLite的多個(gè)副本鏈接到同一個(gè)應(yīng)用程序,那么這個(gè)全局列表將有多個(gè)實(shí)例。使用SQLite庫(kù)的一個(gè)副本打開(kāi)的數(shù)據(jù)庫(kù)連接將不知道使用另一個(gè)副本打開(kāi)的數(shù)據(jù)庫(kù)連接,并且將無(wú)法解決POSIX顧問(wèn)鎖定問(wèn)題。一個(gè)close()方法的一個(gè)連接操作可能在不知不覺(jué)中清除不同的數(shù)據(jù)庫(kù)連接上的鎖,導(dǎo)致數(shù)據(jù)庫(kù)損壞。
上面的場(chǎng)景聽(tīng)起來(lái)很牽強(qiáng)。但是,SQLite開(kāi)發(fā)人員已經(jīng)知道至少有一個(gè)商業(yè)產(chǎn)品正好發(fā)布了這個(gè)錯(cuò)誤。供應(yīng)商來(lái)到SQLite開(kāi)發(fā)人員尋求幫助,以追蹤他們?cè)贚inux和Mac上看到的一些不常見(jiàn)的數(shù)據(jù)庫(kù)損壞問(wèn)題。這個(gè)問(wèn)題最終被追溯到這樣一個(gè)事實(shí),即應(yīng)用程序是連接兩個(gè)單獨(dú)的SQLite副本。解決方案是將應(yīng)用程序構(gòu)建過(guò)程更改為僅鏈接一個(gè)SQLite副本而不是兩個(gè)副本。
2.3。兩個(gè)進(jìn)程使用不同的鎖定協(xié)議
SQLite在unix平臺(tái)上使用的默認(rèn)鎖定機(jī)制是POSIX建議鎖定,但還有其他選項(xiàng)。通過(guò)使用sqlite3_open_v2()接口選擇備用sqlite3_vfs,應(yīng)用程序可以使用可能更適合某些文件系統(tǒng)的其他鎖定協(xié)議。例如,可以選擇在必須在不支持POSIX建議鎖定的NFS文件系統(tǒng)上運(yùn)行的應(yīng)用程序中使用點(diǎn)文件鎖定。
與同一數(shù)據(jù)庫(kù)文件的所有連接使用相同的鎖定協(xié)議非常重要。如果一個(gè)應(yīng)用程序正在使用POSIX顧問(wèn)鎖,而另一個(gè)應(yīng)用程序正在使用點(diǎn)文件鎖定,則這兩個(gè)應(yīng)用程序?qū)⒉粫?huì)看到彼此的鎖定,并且無(wú)法協(xié)調(diào)數(shù)據(jù)庫(kù)訪問(wèn),從而可能導(dǎo)致數(shù)據(jù)庫(kù)損壞。
2.4。在使用時(shí)取消鏈接或重命名數(shù)據(jù)庫(kù)文件
如果兩個(gè)進(jìn)程具有到同一數(shù)據(jù)庫(kù)文件的打開(kāi)連接,并且一個(gè)進(jìn)程關(guān)閉其連接,則取消鏈接該文件,然后在其位置創(chuàng)建一個(gè)具有相同名稱的新數(shù)據(jù)庫(kù)文件并重新打開(kāi)新文件,然后這兩個(gè)進(jìn)程將與不同的進(jìn)程通信具有相同名稱的數(shù)據(jù)庫(kù)文件。(請(qǐng)注意,這僅適用于Posix和Posix類系統(tǒng),它允許文件在讀取和寫(xiě)入時(shí)仍然打開(kāi)時(shí)取消鏈接.Windows不允許這樣做。)由于回滾日志和WAL文件基于數(shù)據(jù)庫(kù)文件的名稱,兩個(gè)不同的數(shù)據(jù)庫(kù)文件將共享相同的回滾日志或WAL文件。其中一個(gè)數(shù)據(jù)庫(kù)的回滾或恢復(fù)可能會(huì)使用其他數(shù)據(jù)庫(kù)中的內(nèi)容,從而導(dǎo)致?lián)p壞。
換句話說(shuō),取消鏈接或重命名打開(kāi)的數(shù)據(jù)庫(kù)文件會(huì)導(dǎo)致行為未定義且可能不合需要。
從SQLite 版本3.7.17(2013-05-20)開(kāi)始,如果數(shù)據(jù)庫(kù)文件在仍在使用時(shí)取消鏈接,則unix OS接口將向錯(cuò)誤日志發(fā)送SQLITE_WARNING消息。
2.5。指向同一文件的多個(gè)鏈接
如果單個(gè)數(shù)據(jù)庫(kù)文件有多個(gè)鏈接(硬鏈接或軟鏈接),那么這只是說(shuō)該文件有多個(gè)名稱的另一種方式。如果兩個(gè)或多個(gè)進(jìn)程使用不同的名稱打開(kāi)數(shù)據(jù)庫(kù),那么它們將使用不同的回滾日志和WAL文件。這意味著如果一個(gè)進(jìn)程崩潰,另一個(gè)進(jìn)程將無(wú)法恢復(fù)正在進(jìn)行的事務(wù),因?yàn)樗鼘⒉檎疫m當(dāng)日志的錯(cuò)誤位置。
換句話說(shuō),打開(kāi)和使用具有兩個(gè)或多個(gè)名稱的數(shù)據(jù)庫(kù)文件會(huì)導(dǎo)致行為未定義且可能不合需要。
從SQLite 版本3.7.17(2013-05-20)開(kāi)始,如果數(shù)據(jù)庫(kù)文件有多個(gè)硬鏈接,則unix OS界面將向錯(cuò)誤日志發(fā)送SQLITE_WARNING消息。
從SQLite 版本3.10.0(2016-01-06)開(kāi)始,unix OS界面將嘗試解析符號(hào)鏈接并按其規(guī)范名稱打開(kāi)數(shù)據(jù)庫(kù)文件。在3.10.0版之前,通過(guò)符號(hào)鏈接打開(kāi)數(shù)據(jù)庫(kù)文件類似于打開(kāi)具有多個(gè)硬鏈接的數(shù)據(jù)庫(kù)文件并導(dǎo)致未定義的行為。
2.6??鏵ork()進(jìn)行打開(kāi)的數(shù)據(jù)庫(kù)連接
不要打開(kāi)SQLite數(shù)據(jù)庫(kù)連接,然后fork(),然后嘗試在子進(jìn)程中使用該數(shù)據(jù)庫(kù)連接。將導(dǎo)致各種鎖定問(wèn)題,您很容易就會(huì)遇到損壞的數(shù)據(jù)庫(kù)。SQLite不是為支持這種行為而設(shè)計(jì)的。必須在子進(jìn)程中打開(kāi)子進(jìn)程中使用的任何數(shù)據(jù)庫(kù)連接,而不是從父進(jìn)程繼承。
如果在父進(jìn)程中打開(kāi)了連接,甚至不要在子進(jìn)程的數(shù)據(jù)庫(kù)連接上調(diào)用sqlite3_close()。關(guān)閉底層文件描述符是安全的,但sqlite3_close() 接口可能會(huì)調(diào)用清除活動(dòng),這些活動(dòng)將從父項(xiàng)下刪除內(nèi)容,從而導(dǎo)致錯(cuò)誤甚至數(shù)據(jù)庫(kù)損壞。
3.未能同步
為了保證數(shù)據(jù)庫(kù)文件始終保持一致,SQLite偶爾會(huì)要求操作系統(tǒng)將所有掛起的寫(xiě)入刷新到持久存儲(chǔ),然后等待該刷新完成。這是使用Windows 下的unix和FlushFileBuffers()下的fsync()系統(tǒng)調(diào)用 完成的。我們將此備用寫(xiě)入的刷新稱為“同步”。
實(shí)際上,如果只關(guān)注原子和一致寫(xiě)入并且愿意放棄持久寫(xiě)入,則同步操作不需要等到內(nèi)容完全存儲(chǔ)在持久性介質(zhì)上。相反,同步操作可以被認(rèn)為是I / O障礙。只要在同步之前發(fā)生的所有寫(xiě)入在同步之后發(fā)生的任何寫(xiě)入之前完成,就不會(huì)發(fā)生數(shù)據(jù)庫(kù)損壞。如果同步作為I / O屏障運(yùn)行而不是真正的同步,則電源故障或系統(tǒng)崩潰可能導(dǎo)致一個(gè)或多個(gè)先前提交的事務(wù)回滾(違反“ACID”的“持久”屬性)但數(shù)據(jù)庫(kù)至少會(huì)繼續(xù)保持一致,這就是大多數(shù)人關(guān)心的問(wèn)題。
3.1。不支持同步請(qǐng)求的磁盤(pán)驅(qū)動(dòng)器
不幸的是,大多數(shù)消費(fèi)級(jí)大容量存儲(chǔ)設(shè)備都在于同步。磁盤(pán)驅(qū)動(dòng)器一旦到達(dá)軌道緩沖區(qū)并且在實(shí)際寫(xiě)入氧化物之前就會(huì)報(bào)告內(nèi)容在安全介質(zhì)上是安全的。這使得磁盤(pán)驅(qū)動(dòng)器似乎運(yùn)行得更快(這對(duì)于制造商來(lái)說(shuō)非常重要,因此他們可以在貿(mào)易雜志中顯示出良好的基準(zhǔn)數(shù)據(jù))。并且公平地說(shuō),只要在軌道緩沖器實(shí)際寫(xiě)入氧化物之前沒(méi)有功率損耗或硬復(fù)位,謊言通常不會(huì)造成傷害。但是,如果確實(shí)發(fā)生了斷電或硬復(fù)位,并且如果這導(dǎo)致在同步到達(dá)氧化物之后寫(xiě)入的內(nèi)容而在同步之前寫(xiě)入的內(nèi)容仍在軌道緩沖區(qū)中,則可能發(fā)生數(shù)據(jù)庫(kù)損壞。
USB閃存棒似乎是關(guān)于同步請(qǐng)求的特別惡毒的騙子。通過(guò)將大型事務(wù)提交到USB記憶棒上的SQLite數(shù)據(jù)庫(kù),可以很容易地看到這一點(diǎn)。COMMIT命令將相對(duì)快速地返回,表明記憶棒告訴操作系統(tǒng)并且操作系統(tǒng)告訴SQLite所有內(nèi)容都安全地存在于持久存儲(chǔ)中,但記憶棒末端的LED將繼續(xù)閃爍幾個(gè)更多秒。在LED仍在閃爍時(shí)拔出記憶棒會(huì)經(jīng)常導(dǎo)致數(shù)據(jù)庫(kù)損壞。
請(qǐng)注意,SQLite必須相信操作系統(tǒng)和硬件告訴它有關(guān)同步請(qǐng)求狀態(tài)的任何信息。SQLite無(wú)法檢測(cè)到任何一個(gè)正在撒謊并且寫(xiě)入可能無(wú)序發(fā)生。但是,WAL模式下的 SQLite對(duì)于無(wú)序?qū)懭氡葘?duì)默認(rèn)回滾日志模式要寬松得多。在WAL模式下,失敗的同步操作可能導(dǎo)致數(shù)據(jù)庫(kù)損壞的唯一時(shí)間是在檢查點(diǎn)操作期間。COMMIT期間的同步失敗可能導(dǎo)致耐久性丟失,但不會(huì)導(dǎo)致?lián)p壞的數(shù)據(jù)庫(kù)文件。因此,由于同步操作失敗導(dǎo)致數(shù)據(jù)庫(kù)損壞的一條防線是在WAL模式下使用SQLite并盡可能不頻繁地檢查點(diǎn)。
3.2。使用PRAGMA禁用同步
可以使用同步編譯指示在運(yùn)行時(shí)禁用SQLite執(zhí)行以幫助確保完整性的同步操作。通過(guò)設(shè)置PRAGMA synchronous = OFF,省略所有同步操作。這使得SQLite似乎運(yùn)行得更快,但它也允許操作系統(tǒng)自由地重新排序?qū)懭耄绻谒袃?nèi)容到達(dá)持久存儲(chǔ)之前發(fā)生電源故障或硬重置,則可能導(dǎo)致數(shù)據(jù)庫(kù)損壞。
為了獲得最大的可靠性和針對(duì)數(shù)據(jù)庫(kù)損壞的穩(wěn)健性,SQLite應(yīng)始終以其默認(rèn)同步設(shè)置FULL運(yùn)行。
4.磁盤(pán)驅(qū)動(dòng)器和閃存故障
如果文件內(nèi)容因磁盤(pán)驅(qū)動(dòng)器或閃存故障而發(fā)生更改,則SQLite數(shù)據(jù)庫(kù)可能會(huì)損壞。這是非常罕見(jiàn)的,但磁盤(pán)偶爾會(huì)在扇區(qū)中間翻轉(zhuǎn)一下。
4.1。非電源安全閃存控制器
我們被告知,在一些閃存控制器中,如果在寫(xiě)入期間電源中斷,則耗損均衡邏輯可能導(dǎo)致隨機(jī)文件系統(tǒng)損壞。例如,這可以表現(xiàn)為在斷電時(shí)甚至沒(méi)有打開(kāi)的文件中間的隨機(jī)變化。因此,例如,當(dāng)發(fā)生斷電時(shí),設(shè)備會(huì)將內(nèi)容寫(xiě)入閃存中的MP3文件,這可能導(dǎo)致SQLite數(shù)據(jù)庫(kù)損壞,即使數(shù)據(jù)庫(kù)在斷電時(shí)甚至沒(méi)有使用。
4.2。假容量USB棒
有許多流通的USB棒在報(bào)告中具有高容量(例如:8GB),但實(shí)際上只能存儲(chǔ)少量(例如:1GB)。嘗試在這些設(shè)備上寫(xiě)入通常會(huì)導(dǎo)致不相關(guān)的文件被覆蓋。因此,任何使用欺詐性閃存設(shè)備都很容易導(dǎo)致數(shù)據(jù)庫(kù)損壞。諸如“假容量usb”之類的互聯(lián)網(wǎng)搜索將會(huì)發(fā)現(xiàn)許多有關(guān)此問(wèn)題的令人不安的信息。
5.記憶腐敗
SQLite是一個(gè)C庫(kù),它在與它所服務(wù)的應(yīng)用程序相同的地址空間中運(yùn)行。這意味著應(yīng)用程序中的雜散指針,緩沖區(qū)溢出,堆損壞或其他故障可能會(huì)破壞內(nèi)部SQLite數(shù)據(jù)結(jié)構(gòu),并最終導(dǎo)致?lián)p壞的數(shù)據(jù)庫(kù)文件。通常情況下,這些類型的問(wèn)題在任何數(shù)據(jù)庫(kù)損壞發(fā)生之前都表現(xiàn)為段錯(cuò)誤,但是有些情況下應(yīng)用程序代碼錯(cuò)誤導(dǎo)致SQLite發(fā)生故障,從而破壞數(shù)據(jù)庫(kù)文件而不是恐慌。
使用內(nèi)存映射I / O時(shí),內(nèi)存損壞問(wèn)題變得更加嚴(yán)重。當(dāng)全部或部分?jǐn)?shù)據(jù)庫(kù)文件映射到應(yīng)用程序的地址空間時(shí),覆蓋該映射空間的任何部分的雜散指針將立即破壞數(shù)據(jù)庫(kù)文件,而不需要應(yīng)用程序執(zhí)行后續(xù)的write()系統(tǒng)調(diào)用。
6.其他操作系統(tǒng)問(wèn)題
有時(shí),操作系統(tǒng)會(huì)出現(xiàn)可能導(dǎo)致問(wèn)題的非標(biāo)準(zhǔn)行為。有時(shí)這種非標(biāo)準(zhǔn)行為是故意的,有時(shí)在實(shí)施中是錯(cuò)誤的。但無(wú)論如何,如果操作的執(zhí)行方式與SQLite期望執(zhí)行的方式不同,則存在數(shù)據(jù)庫(kù)損壞的可能性。
6.1。Linux線程
一些舊版本的Linux使用LinuxThreads庫(kù)來(lái)提供線程支持。LinuxThreads類似于Pthreads,但在處理POSIX顧問(wèn)鎖方面略有不同。SQLite版本2.2.3到3.6.23認(rèn)識(shí)到LinuxThreads正在運(yùn)行時(shí)使用,并采取適當(dāng)?shù)拇胧﹣?lái)解決LinuxThreads的非標(biāo)準(zhǔn)行為。但是大多數(shù)現(xiàn)代Linux實(shí)現(xiàn)都使用了Pthreads的更新,更正確的NPTL實(shí)現(xiàn)。從SQLite 版本3.7.0(2010-07-21)開(kāi)始,假設(shè)使用NPTL。沒(méi)有檢查。因此,如果在使用LinuxThreads的舊Linux系統(tǒng)上運(yùn)行的多線程應(yīng)用程序中使用,SQLite的最新版本將巧妙地出現(xiàn)故障并可能損壞數(shù)據(jù)庫(kù)文件。
6.2。QNX上的mmap()失敗
在QNX上存在mmap()的一些微妙問(wèn)題,使得對(duì)單個(gè)文件描述符進(jìn)行第二次mmap()調(diào)用可以使得從第一個(gè)mmap()調(diào)用獲得的內(nèi)存歸零。unix上的SQLite使用mmap()為WAL模式下的事務(wù)協(xié)調(diào)創(chuàng)建共享內(nèi)存區(qū)域,并且它將為大事務(wù)多次調(diào)用mmap()。已證明QNX mmap()在該場(chǎng)景下?lián)p壞了數(shù)據(jù)庫(kù)文件。QNX工程師意識(shí)到了這個(gè)問(wèn)題,正在研究解決方案; 你讀這篇文章時(shí)可能已經(jīng)解決了這個(gè)問(wèn)題。
當(dāng)QNX運(yùn)行,建議內(nèi)存映射I / O永遠(yuǎn)不會(huì)被使用。此外,要使用WAL模式,建議應(yīng)用程序采用獨(dú)占鎖定模式,以便在沒(méi)有共享內(nèi)存的情況下使用WAL。
6.3。文件系統(tǒng)腐敗
由于SQLite數(shù)據(jù)庫(kù)是普通的磁盤(pán)文件,因此文件系統(tǒng)中的任何故障都可能破壞數(shù)據(jù)庫(kù)。現(xiàn)代操作系統(tǒng)中的文件系統(tǒng)非??煽浚匀粫?huì)發(fā)生錯(cuò)誤。例如,在2013-10-01,持有Wiki for Tcl / Tk的SQLite數(shù)據(jù)庫(kù) 在主機(jī)被轉(zhuǎn)移到文件系統(tǒng)層中存在問(wèn)題的(linux)內(nèi)核的狡猾版本后幾天就被破壞了。在那種情況下,文件系統(tǒng)最終變得如此嚴(yán)重?fù)p壞,以至于機(jī)器無(wú)法使用,但最早出現(xiàn)問(wèn)題的癥狀是SQLite數(shù)據(jù)庫(kù)損壞。
7. SQLite配置錯(cuò)誤
SQLite有許多針對(duì)數(shù)據(jù)庫(kù)損壞的內(nèi)置保護(hù)。但是配置選項(xiàng)可以禁用許多這些保護(hù)。如果禁用保護(hù),則可能會(huì)發(fā)生數(shù)據(jù)庫(kù)損壞。
以下是禁用SQLite內(nèi)置保護(hù)機(jī)制的示例:
如果出現(xiàn)操作系統(tǒng)崩潰或電源故障,設(shè)置PRAGMA synchronous = OFF會(huì)導(dǎo)致數(shù)據(jù)庫(kù)損壞,但此設(shè)置可以避免因應(yīng)用程序崩潰而造成的損壞。
在打開(kāi)其他數(shù)據(jù)庫(kù)連接時(shí)更改PRAGMA schema_version。
使用PRAGMA journal_mode = OFF或PRAGMA journal_mode = MEMORY 并在寫(xiě)入事務(wù)中使應(yīng)用程序崩潰。
設(shè)置PRAGMA writable_schema = ON然后使用DML語(yǔ)句更改數(shù)據(jù)庫(kù)模式可能會(huì)使數(shù)據(jù)庫(kù)完全不可讀,如果不仔細(xì)完成的話。
8. SQLite中的錯(cuò)誤
SQLite經(jīng)過(guò)了非常仔細(xì)的測(cè)試,以幫助確保它盡可能沒(méi)有錯(cuò)誤。在為每個(gè)SQLite版本執(zhí)行的許多測(cè)試中,有一些模擬電源故障,I / O錯(cuò)誤和內(nèi)存不足(OOM)錯(cuò)誤的測(cè)試,并驗(yàn)證在任何這些事件期間都沒(méi)有發(fā)生數(shù)據(jù)庫(kù)損壞。SQLite也經(jīng)過(guò)現(xiàn)場(chǎng)驗(yàn)證,大約有20億次活動(dòng)部署,沒(méi)有嚴(yán)重問(wèn)題。
然而,沒(méi)有軟件100%完美。SQLite(現(xiàn)已修復(fù))中存在一些可能導(dǎo)致數(shù)據(jù)庫(kù)損壞的歷史錯(cuò)誤。還有一些還未被發(fā)現(xiàn)。由于SQLite的廣泛測(cè)試和廣泛使用,導(dǎo)致數(shù)據(jù)庫(kù)損壞的錯(cuò)誤往往非常模糊。應(yīng)用程序遇到SQLite錯(cuò)誤的可能性很小。為了說(shuō)明這一點(diǎn),下面給出了一個(gè)帳戶,其中列出了在2009-04-01至2013-04-15四年期間SQLite中發(fā)現(xiàn)的所有數(shù)據(jù)庫(kù)損壞錯(cuò)誤。這個(gè)帳戶應(yīng)該讓讀者直觀地了解SQLite中存在的各種錯(cuò)誤,這些錯(cuò)誤可以通過(guò)測(cè)試程序完成,并使其成為一個(gè)版本。
8.1。由于數(shù)據(jù)庫(kù)收縮導(dǎo)致的虛假損壞報(bào)告
如果數(shù)據(jù)庫(kù)是由SQLite版本3.7.0或更高版本編寫(xiě)的,然后由SQLite版本3.6.23或更早版本再次編寫(xiě),以使數(shù)據(jù)庫(kù)文件的大小減小,那么下一次SQLite版本3.7.0訪問(wèn)數(shù)據(jù)庫(kù)文件,它可能會(huì)報(bào)告數(shù)據(jù)庫(kù)文件已損壞。但是,數(shù)據(jù)庫(kù)文件并沒(méi)有真正損壞。版本3.7.0在腐敗檢測(cè)中過(guò)于熱心。
問(wèn)題已在2011-02-20修復(fù)。該修復(fù)程序首先出現(xiàn)在SQLite 版本3.7.6(2011-04-12)中。
8.2。在回滾和WAL模式之間切換后出現(xiàn)損壞
在一個(gè)進(jìn)程或線程中反復(fù)切換進(jìn)出WAL模式的SQLite數(shù)據(jù)庫(kù)并在交換機(jī)之間 運(yùn)行VACUUM命令會(huì)導(dǎo)致另一個(gè)打開(kāi)數(shù)據(jù)庫(kù)文件的進(jìn)程或線程錯(cuò)過(guò)數(shù)據(jù)庫(kù)已更改的事實(shí)。然后,第二個(gè)進(jìn)程或線程可能會(huì)嘗試使用陳舊緩存修改數(shù)據(jù)庫(kù)并導(dǎo)致數(shù)據(jù)庫(kù)損壞。
這個(gè)問(wèn)題是在內(nèi)部測(cè)試中發(fā)現(xiàn)的,從未在野外觀察到過(guò)。問(wèn)題已在2011-01-27和3.7.5版本中修復(fù)。
8.3。獲取鎖定時(shí)的I / O錯(cuò)誤會(huì)導(dǎo)致?lián)p壞
如果操作系統(tǒng)在嘗試在WAL模式下獲得對(duì)共享內(nèi)存的某個(gè)鎖定時(shí)返回I / O錯(cuò)誤,則SQLite可能無(wú)法重置其緩存,如果嘗試后續(xù)寫(xiě)入,則可能導(dǎo)致數(shù)據(jù)庫(kù)損壞。
請(qǐng)注意,只有在嘗試獲取鎖定導(dǎo)致I / O錯(cuò)誤時(shí)才會(huì)出現(xiàn)此問(wèn)題。如果沒(méi)有授予鎖定(因?yàn)槟承┢渌€程或進(jìn)程已經(jīng)存在沖突鎖定),則不會(huì)發(fā)生任何損壞。我們不知道在嘗試獲取共享內(nèi)存上的文件鎖時(shí),任何操作系統(tǒng)都會(huì)因I / O錯(cuò)誤而失敗。所以這是一個(gè)理論問(wèn)題,而不是一個(gè)真正的問(wèn)題。不用說(shuō),在野外從未觀察到這個(gè)問(wèn)題。在模擬I / O錯(cuò)誤的測(cè)試工具中對(duì)SQLite進(jìn)行壓力測(cè)試時(shí)發(fā)現(xiàn)了這個(gè)問(wèn)題。
對(duì)于SQLite版本3.7.3,此問(wèn)題已于2010-09-20修復(fù)。
8.4。數(shù)據(jù)庫(kù)頁(yè)面從空閑頁(yè)面列表中泄漏
從SQLite數(shù)據(jù)庫(kù)中刪除內(nèi)容時(shí),不再使用的頁(yè)面將添加到空閑列表中,并重新用于保存后續(xù)插入添加的內(nèi)容。在使用incremental_vacuum時(shí),版本3.6.16到3.7.2中存在的SQLite中的錯(cuò)誤可能會(huì)導(dǎo)致頁(yè)面丟失在空閑列表之外。這不會(huì)導(dǎo)致數(shù)據(jù)丟失。但是這會(huì)導(dǎo)致數(shù)據(jù)庫(kù)文件超出必要的范圍。并且它會(huì)導(dǎo)致integrity_check編譯指示報(bào)告空閑列表中缺少的頁(yè)面。
對(duì)于SQLite版本3.7.2,此問(wèn)題已在2010-08-23修復(fù)。
8.5。從3.6和3.7交替寫(xiě)入后的腐敗。
SQLite版本3.7.0引入了許多SQLite數(shù)據(jù)庫(kù)文件格式的新增強(qiáng)功能(例如但不限于WAL)。3.7.0版本是這些新功能的震撼發(fā)布。我們期待找到問(wèn)題并且沒(méi)有失望。
如果最初使用SQLite版本3.7.0創(chuàng)建數(shù)據(jù)庫(kù),然后由SQLite版本3.6.23.1編寫(xiě),使得數(shù)據(jù)庫(kù)文件的大小增加,然后由SQLite版本3.7.0再次編寫(xiě),則數(shù)據(jù)庫(kù)文件可能會(huì)損壞。
對(duì)于SQLite版本3.7.1,此問(wèn)題已在2010-08-04修復(fù)。
8.6。Windows系統(tǒng)恢復(fù)中的競(jìng)爭(zhēng)條件。
SQLite版本3.7.16.2修復(fù)了Windows系統(tǒng)上鎖定邏輯中的細(xì)微競(jìng)爭(zhēng)條件。當(dāng)數(shù)據(jù)庫(kù)文件需要恢復(fù)時(shí),因?yàn)閷?xiě)入它的先前進(jìn)程在事務(wù)中間崩潰并且兩個(gè)或多個(gè)進(jìn)程嘗試同時(shí)打開(kāi)該數(shù)據(jù)庫(kù),那么競(jìng)爭(zhēng)條件可能導(dǎo)致其中一個(gè)進(jìn)程獲得錯(cuò)誤指示已完成恢復(fù),允許該進(jìn)程繼續(xù)使用數(shù)據(jù)庫(kù)文件而不先運(yùn)行恢復(fù)。如果該進(jìn)程寫(xiě)入文件,則該文件可能會(huì)損壞。這種競(jìng)爭(zhēng)條件顯然存在于SQLite for Windows的所有早期版本中,可追溯到2004年。但競(jìng)爭(zhēng)非常緊張。實(shí)際上,您需要一臺(tái)快速的多核計(jì)算機(jī),在該計(jì)算機(jī)中啟動(dòng)兩個(gè)進(jìn)程以在兩個(gè)單獨(dú)的核心上同時(shí)運(yùn)行恢復(fù)。此缺陷僅在Windows系統(tǒng)上,并不影響posix OS界面。
更多>> 軟件截圖
推薦應(yīng)用
微信聊天記錄恢復(fù)器 12.70 MB
下載/中文/1.0 官方免費(fèi)版Excel修復(fù)專家 650.00 KB
下載/中文/8.0 免費(fèi)版Recuva(文件恢復(fù)大師) 2.53 MB
下載/中文/10.0 v1.52.1086 完全漢化綠色免費(fèi)版Recover My Files(刪除文件恢復(fù)工具) 9.40 MB
下載/中文/10.0 v4.9.4.1324 漢化綠色特別版數(shù)據(jù)恢復(fù)精靈 11.70 MB
下載/中文/10.0 v3.9 綠色特別版finaldata oem v2.0 3.44 MB
下載/中文/0.0 簡(jiǎn)體中文正式特別版easyrecovery pro 6.0 中文版 5.74 MB
下載/中文/0.0 v6.22.06 綠色精簡(jiǎn)破解版Leawo iOS Data Recovery(iOS數(shù)據(jù)恢復(fù)軟件) 22.40 MB
下載/英文/10.0 v3.2.1.0 官方特別版
其他版本下載
精品推薦 sqlite
- 更多 (33個(gè)) >> sqlite sqlite專題是小編精選給大家的數(shù)據(jù)庫(kù)管理工具,可能有朋友不知道sqlite的作用,它是款遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。在編程開(kāi)發(fā)上能夠那起著很大的作用!它幾乎支持所有電腦操作系統(tǒng),完美兼容,不用擔(dān)心系統(tǒng)的配置與穩(wěn)定性!占用內(nèi)存小,就能輕松運(yùn)行!此番,帶來(lái)的專題包含了sq
SQLite Expert Professional(可視化SQL數(shù)據(jù)庫(kù)管理) 11.45 MB
/英文/10.0SQLite Administrator 2.11 MB
/多國(guó)語(yǔ)言[中文]/10.0SQLite Expert Pro(SQLite可視化管理工具) 83.00 MB
/英文/10.0SQLite數(shù)據(jù)庫(kù)管理(Navicat for SQLite) 57.98 MB
/中文/10.0SQLiteManager 917.00 KB
/中文/10.0sqlite3.dll文件 251.00 KB
/中文/10.0sql server To SQLite DB Converte 568.00 KB
/英文/10.0db文件查看器免費(fèi)版 1.76 MB
/中文/10.0
相關(guān)文章
下載地址
SQLiteDoctor(sqlite數(shù)據(jù)庫(kù)修復(fù)工具) v1.4.1 官方免費(fèi)版
查看所有評(píng)論>> 網(wǎng)友評(píng)論
更多>> 猜你喜歡
超級(jí)硬盤(pán)數(shù)據(jù)恢復(fù)軟件官方版(superrecovery)
SuperRecovery
superrecovery注冊(cè)碼生成器
迷你兔minitool數(shù)據(jù)恢復(fù)工具
樓月微信聊天記錄導(dǎo)出恢復(fù)助手
Wise Data Recovery智能文件數(shù)據(jù)恢復(fù)
超級(jí)兔子數(shù)據(jù)恢復(fù)安裝程序
佳佳數(shù)據(jù)恢復(fù)軟件
佳佳數(shù)據(jù)恢復(fù)專業(yè)版
FX文件恢復(fù)精靈(RecoveryGhost)
Hetman Word Recovery(Word文檔恢復(fù)工具)
達(dá)思數(shù)據(jù)恢復(fù)軟件免費(fèi)版(D-Recovery Standard)