2017-02-10 82 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