
我注意到WAL(預寫日誌)與 Firefox Web 瀏覽器使用的 SQLite 資料庫 (*.sqlite) 關聯的檔案 (*.sqlite-wal) 通常會變得相當大。它們實際上可以獲得超過關聯 SQLite 資料庫大小 150 倍的大小,並保持該大小數月(數年?永遠?)。
根據這個 StackOverflow 答案,一個可能的解決方案可能是在每個受影響的儲存資料庫上執行以下 SQLite pragma 命令:
PRAGMA schema.wal_checkpoint(TRUNCATE);
理論上,可以使用 Firefox 外部的 SQLite 工具來執行此操作,但我了解到執行操作之內Firefox 通常會產生最好的結果。 (例如,嘗試omni.jar
在 Firefox 之外工作......它可以是 PITA,因為 Mozilla 使用非典型的 JAR 結構。)
在 Firefox 中,有沒有辦法刷新所有 SQLite 儲存資料庫,以便它們的內容完全寫入對應的.sqlite
檔案中?
更新:
我想提一下,發布這個問題的主要目標之一是安全地處理storage-sync-v2.sqlite-wal
每個 Firefox 設定檔中不斷增長的文件,直到達到 32MB。相應的資料庫,storage-sync-v2.sqlite
也有一個storage-sync-v2.shm
文件,但往往保持相當小。讓事情集中在每題一個主題,我寫了一個專門解決該目標的相關問題。
答案1
退出使用包含相關資料庫的設定檔的 Firefox 實例。
從暫存設定檔啟動 Firefox。打開瀏覽器控制台並貼上以下程式碼片段。編輯路徑字串,使其指向目標設定檔。按Enter
對每個 sqlite 資料庫重複此操作。
希望這會像魅力一樣起作用,但在嘗試任何事情之前備份您的個人資料也沒什麼壞處。
(()=>{
let file = new FileUtils.File("/pathToTargetProfile/places.sqlite"); // edit this string
let db = Services.storage.openDatabase(file);
let stmt = db.createStatement("PRAGMA wal_checkpoint(TRUNCATE)");
stmt.executeStep();
console.log(stmt.row); //this might provide useful info
stmt.finalize();
db.close();
})();
答案2
這實際上是一個很好的問題,但沒有多少人問。
該.sqlite-wal
檔案成長到 32MB 限制,因為這可能是您(或您的套件建立者)在編譯 Firefox 的 sqlite 期間定義的交易日誌限制。
您可以在編譯時調整交易日誌限制的指令稱為SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
它定義在位元組。在你的情況下是 32MB。
您也可以稍後在 sqlite 中使用以下命令調整交易日誌限制:
PRAGMA schema.journal_size_limit = N ;
(再次氮是在位元組,負數無限制)
你必須明白這是一個軟限制,不難。如果您有一個正在寫入日誌的活動進程;即使達到指定的限制,它也會繼續寫入。即使您定義了 20MB 限制,它也可以輕鬆達到 2GB。
這個限制是為了不活躍的交易日記帳。我認為 Firefox 開發人員認為 32MB 是預寫日誌和速度之間的正確平衡。
如果您想在編譯後調整 PRAGMA 大小,您需要為您擁有的每個設定檔執行此操作。如果您打算使用許多設定檔/資料庫,您可能需要使用該SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
集重新編譯它。
引用該人的有效部分:
在 WAL 模式下,預寫日誌檔案不會在檢查點之後被截斷。相反,SQLite 會為後續的 WAL 條目重複使用現有文件,因為覆蓋比追加更快。
Journal_size_limit pragma 可用來限制交易或檢查點之後留在檔案系統中的回溯日誌和 WAL 檔案的大小。每次提交交易或重設 WAL 檔案時,SQLite 都會將檔案系統中剩餘的回滾日誌檔案或 WAL 檔案的大小與此 pragma 設定的大小限制進行比較,如果日誌或 WAL 檔案較大,則會被截斷到極限。
上面列出的編譯指示的第二種形式用於為指定資料庫設定新的位元組限制。負數表示沒有限制。若要始終將回溯日誌和 WAL 檔案截斷為其最小大小,請將journal_size_limit 設定為零。上面列出的編譯指示的第一種形式和第二種形式都會傳回包含單一整數列的單一結果行 - 日誌大小限制的值(以位元組為單位)。預設日誌大小限制為 -1(無限制)。 SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT 預處理器巨集可用於在編譯時變更預設日誌大小限制。
此編譯指示僅在編譯指示名稱之前指定的單一資料庫上執行(如果未指定資料庫,則在「主」資料庫上執行)。必須為每個附加資料庫單獨設定大小限制。
更新:
我忘了提及一個重要的 SQLite 參數 wal_autocheckpoint=N;
(其中 N 是數位共 32KiB頁面在 512KiB 日誌中)。 (截斷數據時OP已經提過)
您可以將其配置為使用較小的自動檢查點。請注意,這會影響 SQLite 的效能,進而影響瀏覽器的效能。太多的檢查點會減慢瀏覽器的速度。
要正確地配置自動檢查點請點擊連結。
還需要注意的是,以這種方式啟動的檢查點是被動的。這意味著 SQLite 應該在不阻塞的情況下盡可能地完成任務。
引用這位男士關於被動模式的說法:
SQLITE_CHECKPOINT_PASSIVE 檢查盡可能多的幀,而不等待任何資料庫讀取器或寫入器完成,然後如果日誌中的所有幀都已檢查點,則同步資料庫檔案。在 SQLITE_CHECKPOINT_PASSIVE 模式下永遠不會呼叫繁忙處理程序回呼。另一方面,如果存在並發讀取器或寫入器,被動模式可能會使檢查點未完成。
與上面的更新說明相同,您也可以在編譯時設定此選項SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=<pages>
。
來自男人:
此巨集設定 WAL 自動檢查點功能的預設頁數。如果未指定,則預設頁數為 1000。