Restore

為什麼 sqlite3 .dump 和還原會導致更小的數據庫文件大小?

  • July 7, 2015

我對數據庫文件大小有一個非常幼稚的問題。我從一個 1.2M 的 SQLite 數據庫開始,將其轉儲到 SQL 文件,然後將其恢復到新數據庫。恢復的數據庫文件只有 50K。這是我的會話的樣子:

$ ls -lh
total 1.2M
-rw-r--r-- 1 user group 1.2M Jul  6 18:37 db.sqlite

$ sqlite3 db.sqlite .dump > db.sql

$ ls -lh
total 1.2M
-rw-r--r-- 1 user group  16K Jul  6 18:38 db.sql
-rw-r--r-- 1 user group 1.2M Jul  6 18:37 db.sqlite

$ cat db.sql | sqlite3 db-restored.sqlite

$ ls -lh
total 1.3M
-rw-r--r-- 1 user group  50K Jul  6 18:38 db-restored.sqlite
-rw-r--r-- 1 user group  16K Jul  6 18:38 db.sql
-rw-r--r-- 1 user group 1.2M Jul  6 18:37 db.sqlite

為什麼恢復的文件比原來的小很多?

使用預設設置,當行(或整個表)被刪除時,SQLite 不會從數據庫文件中刪除空頁。(可以使用PRAGMA auto_vacuum更改此設置。)

在大多數情況下,在數據庫文件中保留空頁面是個好主意,因為它們將被稍後插入的新行重用,並且調整數據庫文件以刪除這些頁面,只是稍後重新分配它們,這將是不必要的成本。

引用自:https://dba.stackexchange.com/questions/106132