如何从sqlite数据库检索所有数据?

3
几天前,我在使用sqlite3数据库时注意到,在删除大量数据(精确地说是整个表格)后,文件大小并没有改变(表格使用了5MB)。虽然这不是我要问的数据库,但也许与我的问题有关。
我有一堆数据库,我正在使用grep -a查找特定消息,我成功地找到了一个大小为50MB的数据库,看起来非常完美!然而,用sqlite3数据库查看器(或sqlite3命令行工具)打开数据库时,表格中只有800多个条目。当前的自动增量索引超过18,000,这应该是表格应该具有的条目数。通过grep查看.db文件,我想要的一切都似乎都在那里,但我猜它们被某种方式“隐藏”了。
如何从sqlite数据库中检索所有数据?请注意,.dump 也不包括我要查找的信息。如果您能简要解释一下这是为什么,以及当我删除一个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的直接消息数据库。)

看起来你问错了问题。在我看来,你无法检索已删除的数据,搜索已删除的消息也没有太多意义。也许你应该先尝试如何清理sqlite数据库? - jww
我想做的事情基本上是相反的,可以查看我对已接受答案的最后一条评论,看看我现在为了满足自己的需求而做了什么。我并没有自己删除数据,Instagram似乎只是很快就将消息从缓存中删除了。不过,Vacuum也是我感兴趣的东西,谢谢你提供的链接! - confetti
1个回答

2

已删除的数据不会立即从数据库文件中删除;请参见更改“从表中删除”后的sqlite文件大小

根据空闲列表页计数,该文件大部分为空,并且运行VACUUM可能会丢弃您正在搜索的数据的余留部分。

没有简单的方法可以恢复已删除的数据(因为缺少一些重要的管理信息)。如果您只对少量数据感兴趣,请尝试使用十六进制编辑器。


非常感谢您的回答和详细解释。然而,“空白空间”让我有些困惑,这难道不意味着删除的数据已经“消失”了(或者至少不能通过catgrep -a直接查看)吗?在我看来,这似乎只是删除了某种索引/元数据/引用,是否有可能以简单的方式重新创建或恢复没有这些内容的数据(不必实际还原数据库到删除之前的状态)? - confetti
“Empty” 意味着数据库实际上并未使用这些数据。而所有已删除的元数据都是为了查找和解释数据必要的。 - CL.
谢谢,那回答了我的问题。为了解决我试图获取 Instagram 消息数据库的问题,我将编写一个脚本,每分钟转储一次数据库(因为我不知道 Instagram 何时清除缓存数据库),同时在我浏览 Instagram 时滚动屏幕,并合并这些转储并删除重复项。 - confetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接