Sqlite3 回滾日誌檔案及其生命週期

2021-10-09 05:50:34 字數 1572 閱讀 9664

sqlite3 的日誌檔案以後綴 joural 命名。

joural檔案即日誌檔案,或稱為回滾日誌檔案。像sqlite這樣的事務資料庫的乙個重要功能就是「原子提交」,在提交的過程中,如果發生作業系統崩潰或斷電等意外情況,在下次開機時,我們希望資料庫能回滾到提交前的狀態,以此來保證資料的「完整性」。

為了能夠實現回滾功能,sqlite在對資料檔案進行任何更改之前,sqlite先建立乙個回滾日誌檔案,該檔案包含將資料庫還原到原始狀態所需的所有資訊,並在提交成功首刪除回滾檔案。

如果發生意外情況,下一次首次連線時,sqlite先會檢查是否存在joural檔案,如果存在則自動根據joural檔案回滾。

預設情況下,joural檔案在一次提交中被建立,在提交完成後生命結束。下圖顯示了sqlite資料庫的一次提交過程。

我們知道在很多系統上,刪除檔案是個消耗大量i/o資源的操作,並且很多的快閃儲存器裝置寫入次數是有限制,如果每一次提交時都建立刪除日誌檔案,這將極大降低快閃儲存器裝置壽命。因此我們不希望sqlite頻繁的建立和刪除joural檔案,可喜的是這一項操作是可配置的,例如:

pragma journal_mode = delete;
日誌檔案設定為可刪除的,並在提交事務後被刪除。

pragma journal_mode = persist;
「永久日誌模式」不會刪除日誌檔案,而是通過將標頭清零達到使檔案失效的目的。

永久日誌模式的使用在許多系統上提供了顯著的效能改進。當然,缺點是在事務提交後很長時間,日誌檔案仍會使用磁碟空間並保留在磁碟上。刪除持久日誌檔案的唯一安全方法是在日誌記錄模式設定為delete的情況下提交事務

顯然只更新標頭,只需要很少的寫操作,這將延長快閃儲存器裝置的壽命,這對嵌入式系統而言是很重要的。

pragma journal_mode = truncate;
在截斷日誌模式下,通過將日誌檔案截短為零而不是刪除日誌檔案(如在delete模式下)或將標頭清零(如在persist模式下)來提交事務。truncate模式具有persist模式的優點,即無需更新包含日誌檔案和資料庫的目錄。因此,截斷檔案通常比刪除檔案快。truncate的另乙個優點是,它不會跟隨系統呼叫(例如:fsync())將更改同步到磁碟。這樣做可能會更安全。但是在許多現代檔案系統上,截斷是原子和同步操作,因此我們認為,面對電源故障,truncate通常將是安全的。

在具有同步檔案系統的嵌入式系統上,truncate導致的行為比persist慢。提交操作的速度相同,但是在truncate之後進行後續事務處理的速度較慢,因為覆蓋現有內容要比追加到檔案末尾要快。新的日記檔案條目將始終在truncate之後追加,但通常會被persist覆蓋。

sqlite3 的日誌檔案可被設定為三種模式:delete 、 persist、truncate。

從效率而言,其效率由高到低是:persist > truncate > delete

回滾事務日誌檔案中的事務

回滾事務日誌檔案中的事務 問 怎樣使用transact sql回滾某個位於事務日誌檔案中的事務 例如,id 0000 0010a183 答 出於預防資料錯誤的考慮,sql server並不支援個別事務的回滾。舉例來說,假設兩個事務t1和t2使用現金餘額域。t1新增了500美金,t2使用更新後的值進行...

Sqlite3 時間型別及操作

例1.select datetime now 結果 2006 10 1712 55 54 例2.select datetime 2006 10 17 結果 2006 10 1712 00 00 例3.select datetime 2006 10 17 00 20 00 1 hour 12 minu...

Linux 下Sqlite3 的安裝及應用

1 安裝 我去的時候是3.7.3版現在估計公升級了。解壓後生成sqlite 3.7.3目錄.cd 進入sqlite 3.7.3。configure make sudo make install 安裝完成。2測試 在任意目錄下新建乙個資料庫,比如student 命令 sqlite3 student s...