2017-02-10 22 views
0

我有一個空的100 MB Sqlite文件,並根據Sqlite的哪個版本我抽它,創建一個4k或100 MB的日誌文件(我攔截創建與inotifywait,並鏈接到它,所以我可以看到它)。兩種日記模式都是delete100 MB空文件的Sqlite真空創建100 MB日誌

release log中,我只能找到one hint關於真空優化,可能會導致這種變化,但我不能真正看到這是否是原因。

無論如何,爲什麼Sqlite的任何版本都會創建一個100 MB的日誌來抽取100 MB的Sqlite文件,其中一個空的表?

版本:

  • 3.7.13 2012-06-11 2時05分22秒f5b5a13f7394dc143aa136f1d4faba6839eaa6dc
  • 3.14.1 2016年8月11日18時53分32秒a12d8059770df4bca59e321c266410344242bf7b

編輯:

這是我如何捕獲任何創建的文件:

for fil in $(inotifywait -e create . |awk '{ print $3 }'); do ln $fil $fil-linked; done 

隨着更新的版本,只有4k雜誌是沒有別的。

編輯2:

混淆真空越來越多。該手冊指出:「VACUUM命令通過將數據庫內容複製到臨時數據庫文件中,然後用臨時文件的內容覆蓋原始文件。」。但是,當我使用inotifywait -m .時,我沒有看到。我看到的是,在兩個空DB和一個數據:

./ ACCESS testdb.sqlite3 
./ ACCESS testdb.sqlite3 
./ ACCESS testdb.sqlite3 
./ ACCESS testdb.sqlite3 
./ CREATE testdb.sqlite3-journal 
./ OPEN testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3-journal 
./ OPEN,ISDIR 
./ CLOSE_NOWRITE,CLOSE,ISDIR 
./ MODIFY testdb.sqlite3-journal 
./ MODIFY testdb.sqlite3 
./ CLOSE_WRITE,CLOSE testdb.sqlite3-journal 
./ DELETE testdb.sqlite3-journal 

而且沒有日記:

./ ACCESS testdb.sqlite3 
./ MODIFY testdb.sqlite3 

回答

0

真空操作創建數據庫的臨時副本,然後需要一個交易帶回滾日誌以寫入實際數據庫。 (即使在一個空的數據庫中,如果啓用了secure_delete,則必須覆蓋所有空白空間,這可能必須回滾)。因此,在最壞的情況下,它可能需要額外的200%的存儲空間。

吸塵不應該經常做,所以它並不總是非常優化。

+0

Secure_delete未打開。我想說,一個空數據庫的臨時副本將是空的。我仍然不明白爲什麼它會這樣做。 – Halfgaar

+0

數據庫*文件*的臨時副本同樣大。 –

+0

在我的文章中查看inotify命令:我捕獲了任何已創建的文件。沒有大文件。 – Halfgaar

相關問題