Checksum VFS 擴充功能是 VFS shim,會在 SQLite 資料庫中每個頁面的結尾新增 8 位元的檢查碼。寫入每個頁面時會新增檢查碼,讀取每個頁面時會驗證檢查碼。檢查碼用於協助偵測由大量儲存裝置中的隨機位元翻轉所造成的資料庫損毀。
Checksum VFS 擴充功能需要 SQLite 版本 3.32.0(2020-05-22)或更新版本。它無法與較早版本的 SQLite 搭配使用。
Checksum VFS 模組是 可載入擴充功能。它未包含在 合併 中。必須在編譯時或執行時將它新增至 SQLite。Checksum VFS 模組的原始程式碼位於 ext/misc/cksumvfs.c 原始程式碼檔案中,位於 SQLite 原始程式碼樹 中。
若要將 Checksum VFS 模組建置成可載入的執行時擴充功能,請使用類似下列的指令
當然,您可以根據專案需求新增其他編譯器選項。
若要將此擴充功能與您的產品靜態連結,請像編譯其他任何 C 語言模組一樣編譯它,但請加入「-DSQLITE_CKSUMVFS_STATIC」選項,讓此模組知道它已靜態連結,而非動態連結。
若要將此擴充功能載入為共用函式庫,您必須先建立一個虛擬的 SQLite 資料庫連線,以作為 sqlite3_load_extension() API 呼叫的引數。然後呼叫 sqlite3_load_extension() API 並關閉虛擬資料庫連線。之後開啟的所有資料庫連線都將包含此擴充功能。例如
sqlite3 *db; sqlite3_open(":memory:", &db); sqlite3_load_extension(db, "./cksumvfs"); sqlite3_close(db);
如果此擴充功能已編譯為 -DSQLITE_CKSUMVFS_STATIC 並與應用程式靜態連結,請使用下列單一 API 呼叫初始化它
sqlite3_cksumvfs_init();
Cksumvfs 是 VFS shim。載入後,「cksmvfs」會成為新的預設 VFS,並使用先前的預設 VFS 作為堆疊中的下一個 VFS。這通常是您想要的。但是,在載入多個 VFS shim 的複雜情況下,可能需要確保 cksumvfs 以正確順序載入,以便它以正確順序排列到預設 VFS Shim 堆疊中。
使用 sqlite3_open() 或 sqlite3_open_v2() 介面開啟資料庫連線,如同平常一樣。一般資料庫檔案(沒有檢查碼)將正常運作。如果遇到包含無效檢查碼的頁面,資料庫檢查碼將傳回 SQLITE_IOERR_DATA 錯誤。
檢查碼僅適用於 保留位元組 值正好為 8 的資料庫。保留位元組的預設值為 0。因此,新建立的資料庫檔案預設會省略檢查碼。若要建立包含檢查碼的資料庫,請執行類似下列程式碼,將保留位元組值變更為 8
int n = 8; sqlite3_file_control(db, 0, SQLITE_FCNTL_RESERVE_BYTES, &n);
如果您在建立新資料庫檔案後立即執行此動作,在檔案中寫入任何其他內容之前,那可能就是您需要執行的所有動作。否則,上述 API 呼叫應接著執行
sqlite3_exec(db, "VACUUM", 0, 0, 0);
執行 VACUUM 永遠不會有壞處,即使您不需要它。如果資料庫處於 WAL 模式,您應該關閉並重新開啟所有資料庫連線,然後才能繼續。
從 CLI 使用「.filectrl reserve_bytes 8」指令,接著使用「VACUUM;」。
請注意,SQLite 允許增加 reserve-bytes 的數量,但不能減少。因此,如果資料庫檔案已經有 reserve-bytes 值大於 8,除了傾印並還原資料庫檔案之外,沒有辦法在該資料庫上啟用校驗和。另請注意,其他擴充功能也可能使用 reserve-bytes。校驗和將與那些其他擴充功能不相容。
如果任何校驗和不正確,「PRAGMA quick_check」指令將會找到它。若要驗證校驗和是否實際上已啟用並執行,請使用類似下列的 SQL
SELECT count(*), verify_checksum(data) FROM sqlite_dbpage GROUP BY 2;
verify_checksum() 函數有三個可能的輸出:1、0 和 NULL。如果校驗和正確,則傳回 1。如果校驗和不正確,則傳回 0。如果頁面無法讀取,則傳回 NULL。如果啟用校驗和,如果校驗和錯誤,讀取將會失敗,因此 verify_checksum() 在校驗和錯誤時通常的結果是 NULL。
如果一切都正常,上述查詢應傳回單一列,其中第二欄為 1。任何其他結果都表示有校驗和錯誤,或已停用校驗和驗證。
cksumvfs 擴充功能實作一個新的 PRAGMA 陳述式,可用于停用、重新啟用或查詢校驗和驗證的狀態
PRAGMA checksum_verification; -- query status PRAGMA checksum_verification=OFF; -- disable verification PRAGMA checksum_verification=ON; -- re-enable verification
「checksum_verification」指令碼會回傳「1」(真)或「0」(假),分別表示是否啟用或停用檢查碼驗證。此處的「驗證」是指在讀取時偵測到檢查碼不符時,會導致 SQLITE_IOERR_DATA 錯誤的功能。只要資料庫的保留位元組值為 8,就會持續更新檢查碼,與此指令碼的設定無關。可以停用檢查碼驗證(例如)來對先前報告檢查碼錯誤的資料庫執行鑑識分析。
如果資料庫檔案的保留位元組值不是 8,「checksum_verification」指令碼永遠會回應「0」。如果未載入 cksumvfs 擴充功能,指令碼不會回傳任何列。
此頁面最後修改時間:2022-01-08 05:02:57 UTC