小巧。快速。可靠。
任選三項。
VACUUM

1. 語法

vacuum-stmt

VACUUM schema-name INTO filename

2. 說明

VACUUM 指令會重建資料庫檔案,並將其重新打包成最小的磁碟空間。有幾個原因會讓應用程式執行此動作

預設情況下,VACUUM 會對主資料庫執行操作。可以透過將適當的 schema-name 附加到 VACUUM 陳述式,對 附加資料庫 執行 VACUUM。

相容性警告:對附加資料庫執行 VACUUM 的功能已新增至 版本 3.15.0(2016-10-14)。在此之前,附加到 VACUUM 陳述式的 schema-name 會被自動忽略,而「主」架構會執行 VACUUM。

2.1. 包含 INTO 子句的 VACUUM

如果包含 INTO 子句,則原始資料庫檔案不變,且會在 INTO 子句引數指定的檔案中建立新的資料庫。引數是純量 運算式,例如文字字串。新的資料庫會包含與原始資料庫相同的邏輯內容,並已完全執行 VACUUM。

包含 INTO 子句的 VACUUM 指令是產生即時資料庫備份副本的 備份 API 的替代方案。使用 VACUUM INTO 的優點是,產生的備份資料庫大小最小,因此可以減少檔案系統 I/O 的數量。此外,所有已刪除的內容都會從備份中清除,不留下任何鑑識痕跡。另一方面,備份 API 使用較少的 CPU 週期,而且可以逐步執行。

INTO 子句中的檔案名稱可以是評估為字串的任意 SQL 表達式。INTO 子句所指定的檔案不可事先存在,否則必須是空檔案,否則 VACUUM INTO 指令會因錯誤而失敗。

如果啟用 URI 檔案名稱,則 INTO 的引數可以是 URI 檔案名稱。如果符合下列任一條件,則會啟用 URL 檔案名稱

VACUUM INTO 指令在交易方面,產生的輸出資料庫是原始資料庫的一致快照。不過,如果 VACUUM INTO 指令因意外關機或斷電而中斷,則產生的輸出資料庫可能會不完整且損毀。此外,SQLite 沒有在產生的資料庫上呼叫 fsync() 或 FlushFileBuffers(),以確保在完成之前已到達非揮發性儲存體。

3. VACUUM 的運作方式

VACUUM 指令透過將資料庫內容複製到暫時資料庫檔案,然後使用暫時檔案的內容覆寫原始檔案來執行。在覆寫原始檔案時,會使用回滾日誌或 預寫式記錄 WAL 檔案,就像對任何其他資料庫交易一樣。這表示在對資料庫執行 VACUUM 時,需要在可用磁碟空間中保留與原始資料庫檔案大小相同或兩倍的空間。

VACUUM INTO 指令的執行方式相同,但它會使用 INTO 子句中指定的文件取代暫時資料庫,並省略將已整理資料庫複製回原始資料庫頂部的步驟。

VACUUM 指令可能會變更沒有明確 INTEGER PRIMARY KEY 的任何資料表中條目的 ROWID

如果在嘗試執行 VACUUM 的資料庫連線上有開放的交易,VACUUM 將會失敗。未完成的 SQL 陳述式通常會保留開啟的讀取交易,因此如果在同一個連線上存在未完成的 SQL 陳述式,VACUUM 可能會失敗。VACUUM(但不是 VACUUM INTO)是寫入操作,因此如果另一個資料庫連線保留了防止寫入的鎖定,VACUUM 將會失敗。

使用 VACUUM 指令回收已刪除資料後的空間的替代方案是自動整理模式,使用 auto_vacuum pragma 啟用。當為資料庫啟用 auto_vacuum 時,可以在刪除資料後回收可用頁面,導致檔案縮小,而無需使用 VACUUM 重新建構整個資料庫。但是,使用 auto_vacuum 可能會導致資料庫檔案額外分段。而且 auto_vacuum 不會像 VACUUM 一樣壓縮資料庫中部分填滿的頁面。

此頁面最後修改於 2023-12-05 14:43:20 UTC