Linux
SQLite 和預寫日誌記錄:為什麼這麼大的文件
我最近一直在對 SQLite 數據庫進行一些操作。
前幾天我執行了一個命令,從一個 1GB 的數據庫文件中刪除了一堆行,而 WAL 文件超過了 8GB,此時它填滿了我的分區。
為什麼這樣做?我怎樣才能阻止它?
以下是為此數據庫設置的一些 PRAGMA:
PRAGMA wal_autocheckpoint = 1000 PRAGMA page_size = 1024 PRAGMA max_page_count = 1073741823 PRAGMA journal_size_limit = -1 PRAGMA journal_mode = WAL PRAGMA auto_vacuum = 0
當我想讓數據庫變得更小因為它開始佔用我的磁碟空間時,我可以改變什麼來阻止 WAL 文件變得如此之大?而且這樣的事情會影響性能嗎?
我確實知道該庫是自定義編譯的,但我不確定編譯時間選項。能以某種方式發現嗎?
如果相關,它在 Debian Linux 中的 SSD 上執行。
WAL 文件記錄自上次檢查點以來對數據庫的所有更改。
(自動)檢查點在數據庫鎖定時無法執行,因此請確保沒有與活動事務的其他連接。
文件說:
預設情況下,用於事務控制的輔助預寫日誌和共享記憶體文件會在與數據庫的最新連接關閉時自動刪除。
因此,請確保在某個時間關閉所有數據庫連接。
(如果您使用 禁用刪除 WAL 文件
SQLITE_FCNTL_PERSIST_WAL
,則必須設置PRAGMA journal_size_limit
為非負值以在這種情況下將 WAL 文件截斷為零字節。)