mcpField
S
storage-format

storage-format

github.com/tursodatabase数据与数据库25.1k1.3k 次安装今天更新
代码仓库

关于 storage-format

这份指南介绍 Turso 的 SQLite 数据库文件布局和存储结构,面向检查或调试磁盘数据的开发者。内容涵盖文件头、页面与单元格类型、记录、B-tree、溢出页和空闲列表。

主要功能

  1. 01数据库文件头字段与编码
  2. 02页面和单元格布局
  3. 03表与索引的 B-tree 结构
  4. 04记录与序列类型格式
  5. 05溢出页和空闲列表

适用场景

  1. 01检查 SQLite 数据库文件
  2. 02调试页面与 B-tree 行为
  3. 03检查数据库完整性和页面计数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tursodatabase/turso --skill storage-format

安装后在 Claude Code 中输入/storage-format确认已加载。

详细介绍

存储格式指南

数据库文件结构

┌─────────────────────────────┐
│ Page 1: Header + Schema     │  ← First 100 bytes = DB header
├─────────────────────────────┤
│ Page 2..N: B-tree pages     │  ← Tables and indexes
│            Overflow pages   │
│            Freelist pages   │
└─────────────────────────────┘

页大小:2 的幂,范围为 512–65536 字节。默认值为 4096。

数据库头部(前 100 字节)

偏移量大小字段
016魔数:"SQLite format 3\0"
162页大小(大端序)
181写入格式版本(1=回滚,2=WAL)
191读取格式版本
244更改计数器
284数据库页数
324第一个空闲列表主干页
364空闲列表页总数
404架构 cookie
564文本编码(1=UTF8,2=UTF16LE,3=UTF16BE)

所有多字节整数均采用大端序。

页类型

标志类型用途
0x02内部索引页索引 B 树内部节点
0x05内部表页表 B 树内部节点
0x0a叶索引页索引 B 树叶节点
0x0d叶表页表 B 树叶节点
-溢出页超出单元容量的有效载荷
-空闲列表页未使用的页(主干页或叶页)

B 树结构

两种 B 树类型:

  • 表 B 树:使用 64 位 rowid 作为键,存储行数据
  • 索引 B 树:使用任意键(索引列 + rowid)
Interior page:  [ptr0] key1 [ptr1] key2 [ptr2] ...
                   │         │         │
                   ▼         ▼         ▼
               child     child     child
               pages     pages     pages

Leaf page:     key1:data  key2:data  key3:data ...

第 1 页始终是 sqlite_schema 表的根页。

单元格式

表叶单元
[payload_size: varint] [rowid: varint] [payload] [overflow_ptr: u32?]
表内部单元
[left_child_page: u32] [rowid: varint]
索引单元

格式类似,但键是任意值(列 + rowid),而不只是 rowid。

记录格式(有效载荷)

[header_size: varint] [type1: varint] [type2: varint] ... [data1] [data2] ...

序列类型:

类型含义
0NULL
1-41/2/3/4 字节有符号整数
56 字节有符号整数
68 字节有符号整数
7IEEE 754 浮点数
8整数 0
9整数 1
≥12 偶数BLOB,长度=(N-12)/2
≥13 奇数文本,长度=(N-13)/2

溢出页

当有效载荷超过阈值时,超出部分会存储在溢出链中:

[next_page: u32] [data...]

最后一页的 next_page=0。

空闲列表

由主干页组成的链表,每个主干页都包含叶页编号:

Trunk: [next_trunk: u32] [leaf_count: u32] [leaf_pages: u32...]

Turso 实现

关键文件:

  • core/storage/sqlite3_ondisk.rs - 磁盘格式,PageType 枚举
  • core/storage/btree.rs - B 树操作(大型文件)
  • core/storage/pager.rs - 页管理
  • core/storage/buffer_pool.rs - 页缓存

存储调试

# Integrity check
cargo run --bin tursodb test.db "PRAGMA integrity_check;"

# Page count
cargo run --bin tursodb test.db "PRAGMA page_count;"

# Freelist info
cargo run --bin tursodb test.db "PRAGMA freelist_count;"

参考资料

评论

支持 Markdown