Sqlite

db 日誌與 fs 日誌

  • April 4, 2020

SQLite 有一個用於 journal_mode 的編譯指示,我假設它可以在其他 sql 數據庫程序(MySQL、PostgreSQL、MS-SQL 等)中使用,所以這個問題也適用於所有像 SQLite 一樣提供日誌模式的數據庫程序。

大多數現代文件系統(BtrFS、Ext4、NTFS 等)都使用日誌。由於數據庫通常儲存在日誌文件系統上,數據庫程序也記錄日誌不是多餘的嗎?

啟用 SQLite journal_mode 時,與禁用 journal_mode 相比,大量更新和/或插入需要非常長的時間才能完成。

SQLite 的編譯指示是特定於 SQLite 的;你不會PRAGMA在其他引擎中找到它們(或者實際上是語句)。

至於數據庫“日誌”,這只是 SQLite 的事務日誌名稱(參見journal_modeSQLite 參考中的條目)。事務日誌與文件系統日誌完全不同,通常不是您想要禁用的東西。如果沒有事務日誌,您將無法回滾事務,並且(如鍊接文件所述):“如果應用程序在設置 OFF 日誌模式時在事務中間崩潰,那麼數據庫文件很可能會損壞。”

文件系統日誌有助於確保文件系統在崩潰後(不久)保持一致;但這並沒有說明從應用程序(例如 SQLite)的角度來看,該文件系統中文件的內部結構是否一致。

換句話說:不,它不是多餘的,並且大多數其他數據庫不提供任何禁用事務日誌的選項。我建議如果您的插入和更新進展緩慢,可能還有其他原因(每個事務進行了多少更改等)

日誌對於使數據庫能夠提供他們承諾的 ACID(原子、一致、隔離、持久)保證至關重要。SQL-ite 支持模式: DELETE, TRUNCATE, PERSIST, MEMORY, WAL,OFF

  • DELETE, TRUNCATE,PERSIST指定每次事務送出後處理日誌文件的不同方式。
  • WAL- 預寫日誌記錄允許就地更新數據庫文件
  • MEMORY, OFF- 允許崩潰時的不一致狀態,儘管OFF “允許使用普通 SQL 破壞數據庫文件”

為了提高性能,預寫日誌 (WAL) 有時會有所幫助,或者使用為多個並發寫入者設計的數據庫。

引用自:https://dba.stackexchange.com/questions/165123