刪除日志文件聽起來是個糟糕的主意。它允許sqite在崩潰后將數據庫回滾到一致狀態。如果在數據庫處于不一致狀態時刪除它,則會留下損壞的數據庫。引用方形遺址:
如果確實發生崩潰或停電,并且磁盤上保留了一個熱日志,則必須將原始數據庫文件和熱日志保留在磁盤上,并帶有它們的原始名稱,直到數據庫文件被另一個SQLite進程打開并回滾為止。[.]
我們懷疑SQLite恢復的常見故障模式是這樣發生的:發生電源故障?;謴碗娫春?,善意的用戶或系統管理員開始四處查看磁盤是否損壞。他們看到了他們的數據庫文件,名為“import ant.data”。他們可能對這個文件很熟悉。但在崩盤后,也有一個熱門雜志名為“重要數據日記”。然后,用戶刪除熱門日志,認為他們正在幫助清理系統。除了用戶教育之外,我們不知道有什么辦法可以阻止這種情況。
回滾應該在下一次打開數據庫時自動發生,但如果進程無法鎖定數據庫,則會失敗。正如其他人所說,造成這種情況的一個可能原因是,另一個進程目前正在進行之中。如果數據庫位于NFS卷上,則另一種可能是過期的NFS鎖。在這種情況下,解決方法是將數據庫文件替換為未鎖定在NFS服務器上的新副本(MV database.db源.db;cp initial.db database.db)。請注意,sqlitFAQ建議注意并發訪問NFS卷上的數據庫,因為NFS文件鎖定的實現存在缺陷。
我無法解釋為什么刪除日志文件會讓您鎖定以前無法鎖定的數據庫。那是可復制的嗎?
順便說一句,日志文件的存在并不一定意味著發生了崩潰,也不一定意味著需要回滾更改。Sqlitt有幾種不同的日志模式,并且在持久化或截斷模式中,它總是將-日記文件放在適當的位置,并更改內容以指示是否有部分事務要回滾。