100 MB空文件的Sqlite真空创建100 MB日志

时间:2017-02-10 09:26:35

标签: sqlite

我有一个空的100 MB Sqlite文件,根据我真空吸尘器的Sqlite版本,它会创建一个4k或100 MB的日志文件(我用inotifywait拦截了创建,并链接到它我能看到它)。这两种日记帐模式都是delete

release log中,我只能找到one hint关于可能导致更改的真空优化,但我无法确定是否是原因。

无论如何,为什么任何版本的Sqlite都会创建一个100 MB的日志来使用一个空的表来清空一个100 MB的Sqlite文件?

版本:

  • 3.7.13 2012-06-11 02:05:22 f5b5a13f7394dc143aa136f1d4faba6839eaa6dc
  • 3.14.1 2016-08-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 .时,我看不到。我所看到的只是一个空数据库和一个数据:

./ 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

1 个答案:

答案 0 :(得分:0)

VACUUM操作会创建数据库的临时副本,然后需要带有回滚日志的事务才能写入实际数据库。 (即使在空数据库中,如果启用了secure_delete,也必须覆盖所有空白空间,这可能必须回滚。)因此,在最坏的情况下,它可能需要额外200%的存储空间。

不应该经常吸尘,所以它并不总是非常优化。