几天前,我一直在使用sqlite3数据库,并注意到删除了大量数据(整个表格(DROP
)后),文件大小没有变化(表使用了5MB)。不是我要问的数据库,但也许这与我的问题有关。
我有一堆数据库,我正在使用grep -a
查找特定邮件,我成功地发现有问题的数据库大小为50MB,看起来很完美!但是,在sqlite3数据库查看器(或sqlite3
命令行工具)中打开数据库仅显示messages
表中的800多个条目。当前的自动增量索引高于18.000,这是表应具有的条目数。使用grep
浏览.db文件,我想要的一切似乎都在那里,但我猜不出来"隐藏"(?)。
如何从sqlite数据库中检索所有数据?请注意,.dump <table>
也不包含我正在寻找的消息。为了快速解释这个以及为什么数据实际上没有删除/文件大小在我删除5MB表时不会缩小我也应该感恩。
sqlite> .dbinfo
database page size: 4096
write format: 1
read format: 1
reserved bytes: 0
file change counter: 366
database page count: 11405
freelist page count: 10372
schema cookie: 2
schema format: 4
default cache size: 0
autovacuum top root: 0
incremental vacuum: 0
text encoding: 1 (utf8)
user version: 7
application id: 0
software version: 3008005
number of tables: 3
number of indexes: 1
number of triggers: 0
number of views: 0
schema size: 737
(请注意,我没有创建也没有编辑过这个数据库,它是Instagram的直接消息数据库。)
答案 0 :(得分:1)
删除的数据不会立即从数据库文件中删除;见change sqlite file size after "DELETE FROM table"。
如空闲列表页数所示,该文件大部分为空,并且运行VACUUM可能会丢弃您正在搜索的数据的剩余部分。
没有简单的方法来恢复已删除的数据(因为缺少一些重要的管理信息)。如果您只对少量数据感兴趣,请尝试使用十六进制编辑器。