gpt4 book ai didi

sqlite - 在 sqlitedb 文件中解析 SQLite 数据库架构?

转载 作者:行者123 更新时间:2023-12-03 16:55:57 26 4
gpt4 key购买 nike

我编写了一个用于解析 SQLite 文件的程序,我可以解析 b 树页面中的所有数据以记录、列和值,但我需要解析表的模式,我发现了类似 的内容存储在第 1 页(根页)中的数据库模式 我可以用 Hex Editor 看到它,我找到了 sqlite_master 的结构,我完全按照 http://sqlite.org/fileformat2.html 中的解释阅读了它

我想知道如何在 db 文件中找到 sqlite_master 表的第一个字节,如何检测模式的起始字节? SQLite DB Header 中有什么相关的吗?

编辑 1(更多信息):

例如:
我用十六进制编辑器打开了 sqlite db,(如果你检查我的页面大小是 4096 字节并且我在图像中标记了页眉):
enter image description here

我标记了以 05 开头的根页面标题表示 the page is an interior table b-tree page并请检查 B-tree 页头格式 ( http://sqlite.org/fileformat2.html ) 并且它有 5 个单元格,您可以使用此单元格指针数组查看它:0FFB、0FF6、0FF1、0FEC、0FE7(在结束 header 之后开始)并且所有单元格都有 5 个字节并从 0FE7 开始,然后是您可以看到的架构图片中(文本部分)从 232~240 开始,我检查了不同位置的其他数据库和模式...

编辑 2:

您可以从 https://www.dropbox.com/s/lanky02kneyb74w/31bb7ba8914766d4ba40d6dfb6113c8b614be442 下载示例文件

编辑 3:

在我的文件中你可以看到

$ hexdump -C 31bb7ba8914766d4ba40d6dfb6113c8b614be442

00000000 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 |SQLite format 3.|
00000010 10 00 02 02 00 40 20 20 00 00 00 02 00 00 00 3f |.....@ .......?|
00000020 00 00 00 00 00 00 00 00 00 00 00 47 00 00 00 04 |...........G....|
00000030 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000060 00 2d e2 25 05 00 00 00 05 0f e7 00 00 00 00 3d |.-.%...........=|
00000070 0f fb 0f f6 0f f1 0f ec 0f e7 08 7f 07 9d 08 3c |...............<|
00000080 07 01 06 22 05 92 04 fe 03 fc 04 c1 03 4d 02 b8 |...".........M..|
00000090 02 0a 02 75 01 32 01 c7 00 e9 00 e9 00 00 00 00 |...u.2..........|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000e0 00 00 00 00 00 00 00 00 00 47 18 06 17 5b 35 01 |.........G...[5.|
000000f0 00 69 6e 64 65 78 73 71 6c 69 74 65 5f 61 75 74 |.indexsqlite_aut|
00000100 6f 69 6e 64 65 78 5f 41 42 4d 75 6c 74 69 56 61 |oindex_ABMultiVa|
00000110 6c 75 65 45 6e 74 72 79 4b 65 79 5f 31 41 42 4d |lueEntryKey_1ABM|
00000120 75 6c 74 69 56 61 6c 75 65 45 6e 74 72 79 4b 65 |ultiValueEntryKe|

Page Header ( offset 64)

05 <- interior table b-tree page
0000 <- Byte offset into the page of the first freeblock
0005 <- Number of cells on this page
0FE7 <- Offset to the first byte of the cell content area
00 <- Number of fragmented free bytes
0000003D (61) <- The right-most pointer

Cell Array Pointers & Cell Contents:
(Table Interior Cell Format)

Cell Pointer| Page number of left child | Rowid
------------|---------------------------|-------
0FFB | 0000001A (26) | 15
0FF6 | 0000001C (28) | 2D
0FF1 | 00000031 (49) | 3C
0FEC | 00000039 (57) | 48
0FE7 | 0000003C (60) | 4C <- equal to (Offset to the first byte of the cell content area) in page header

最佳答案

我知道你的问题是一年多前提出的,你可能已经解决了,但我想提交一个答案,以防其他人有同样的问题。我和你的情况一样,迈赫迪。我想读取一个 SQLite 数据库文件,并且正在寻找主表/模式。它似乎在第 1 页,但标题没有指向它。我的困惑有两个原因。

(1) 我的 SQLite 数据库文件中有很多未被使用的“死”数据。我相信随着数据库的创建和增长,实际事件数据的位置会移动,并且旧位置不会被零覆盖。搜索一些“CREATE TABLE”语句在文件的不同位置发现了多个结果。后来我确定实际模式被拆分并位于第 18、10 和 8 页(第 1 页内部表所指向)。如果不是原因#2,我会更早地检测到这一点。

(2) 我计算错了页码的字节位置,这让我很困惑。其中 p = 页 #,s = 页大小,我以为是 [p * s] .... 但实际上它是 [(p-1) * s](除了从第 100 字节开始的第 1 页)。换句话说,我认为页码从 0 开始,而不是从 1 开始。

作为附加说明,我相信 http://sqlite.org/fileformat2.html页面缺少一些重要信息。具体来说,它没有解释“根页面”编号在模式表中的位置(它在字段 4 中)。我在 sqlite.org 页面上找不到此信息。

关于sqlite - 在 sqlitedb 文件中解析 SQLite 数据库架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21936528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com