(つ`ω´)つ says to Ubuntu 台灣社群
SQLite 沒有執行檢查碼功能 (★ 101 分) SQLite 預設情況下並不執行檢查碼(checksum)功能,這意味著當資料庫發生損毀時,應用程式無法自行偵測出異常。即使單一位元錯誤(bit flip)也可能導致資料庫出現問題,這種情況可能由於硬碟故障、驅動程式的錯誤,甚至其他應用程式(惡意或非故意的)對資料庫檔案進行修改所引起。 這並非 SQLite 的漏洞,而是其設計使然。SQLite 文件明確指出:偵測和修復因宇宙射線、熱噪聲、量子波動或驅動程式錯誤等引發的錯誤,應由底層硬體和作業系統負責,而非 SQLite。SQLite 沒有在資料庫檔案中增加任何額外的冗餘來偵測這類腐敗或 I/O 錯誤。SQLite 假設它讀取的資料與之前寫入的資料完全一致。 雖然 SQLite 支援 WAL(Write-Ahead Logging)框架的檢查碼功能,但在偵測到損毀的框架後,SQLite 會默默地忽略損毀的框架和後續的所有框架,且不會丟擲錯誤訊息,這點讓作者感到不安。 若真的需要檢查碼功能,開發者可以選擇使用 Checksum VFS Shim,但這有一個很大的限制:只有在頁面尾端額外儲存位元數(reserve bytes)設為 8 的資料庫中才有效。如果有其他擴展使用了這些 reserve bytes,則無法同時使用 Checksumming 功能。 總結來說,這不是 SQLite 的設計缺陷,而是對底層系統的信任,使其假設檔案系統與硬體都是可靠的。這是否會成為一個問題,則取決於應用程式本身的需求和要求的資料完整性保證。 👥 77 則討論、評論 💬 https://news.ycombinator.com/item?id=42094663