🗃️ 了解基岩版数据库架构
Minecraft 基岩版采用与 Java 版完全不同的存储系统。基岩版不是使用 Anvil 区域文件,而是使用 Google 的 LevelDB,并由 Mojang 进行修改,加入 Zlib 压缩与 Windows 支持。该机制保证了跨平台兼容与高效的数据访问。
LevelDB 数据库系统
基于键值对的存储,使用修改版 LevelDB 与 Zlib 压缩
区块键格式
包含坐标与类型标签的复杂键结构
小端序 NBT
使用小端序字节顺序的 NBT 格式
跨平台支持
为移动端、主机与 Windows 平台优化
🗄️ LevelDB 数据库格式
基岩版使用 Mojang 修改后的 Google LevelDB 来高效存储世界数据。
📍 数据库位置
LevelDB 数据库存储在每个基岩版世界的 db/ 子目录中:
worlds/YourWorldName/db/
重要: 传给 LevelDB API 的路径是目录路径,而不是目录中的某个文件。
🔧 Mojang 修改
- Zlib 压缩: 提高存储效率
- Windows 支持: 跨平台兼容
- 自定义键格式: 专用区块寻址系统
- 小端序 NBT: 改造 NBT 字节序
源码: 参见 github.com/Mojang/leveldb
🔄 数据组织
LevelDB 使用键值存储,其中:
- 键:包含区块坐标、维度与数据类型
- 值:保存实际区块数据、实体或元数据
- 压缩:使用 Zlib 压缩以节省空间
- 索引:快速随机访问特定区块
🔑 区块键格式系统
理解 LevelDB 中用于识别与访问区块数据的二进制键结构。
📊 键结构组件
1. 区块坐标
两个有符号 32 位小端整数
X 坐标(4 字节)+ Z 坐标(4 字节)
2. 维度 ID(可选)
32 位小端整数
主世界省略,1 为下界,2 为末地
3. 记录类型标签
1 字节标签,用于标识数据类型
见下方的键类型标签表
4. 子区块索引(可选)
SubChunkPrefix 记录使用 1 字节索引
0 到 15,表示不同高度层
🔢 键长度
- 9 字节:主世界区块(8 字节坐标 + 1 字节类型)
- 10 字节:主世界子区块(9 字节 + 1 字节索引)
- 13 字节:其他维度区块(12 字节 + 1 字节类型)
- 14 字节:其他维度子区块(13 字节 + 1 字节索引)
🏷️ 区块键类型标签
基岩版区块键中所有记录类型标签的完整参考。
地形与生物群系数据
6 种类| 十进制 | 十六进制 | ASCII | 名称 | 说明 |
|---|---|---|---|---|
| 43 | 2B | + | Data3D | 高度图(256×2 字节)与生物群系数据(长度可变)。生物群系以 25 个调色板存储,ID 为整数 |
| 44 | 2C | , | Version | 1 字节版本标识:0 为旧世界,较高值为无限世界 |
| 45 | 2D | - | Data2D | 高度图(256×2 字节)与 2D 生物群系(256×1 字节)。生物群系 ID 为 8 位整数。自 v1.18.0 起不再写入 |
| 46 | 2E | . | Data2DLegacy | 高度图(256×2 字节)与 2D 生物群系(256×4 字节)。生物群系 ID 在首字节,后三字节为 RGB。自 v1.0.0 起不再写入 |
| 47 | 2F | / | SubChunkPrefix | 子区块版本(1 字节)+ 版本相关数据。用于 16×16×16 子区块地形 |
| 48 | 30 | 0 | LegacyTerrain | 方块 ID(32768 字节)、元数据(32768 半字节)、天空/方块光照(各 32768 半字节)、高度图(256×1 字节)、2D 生物群系(256×4 字节)。数据按 XZY 顺序存储。自 v1.0.0 起不再写入 |
实体与方块实体数据
4 种类| 十进制 | 十六进制 | ASCII | 名称 | 说明 |
|---|---|---|---|---|
| 49 | 31 | 1 | BlockEntity | NBT 复合根列表 - 方块实体数据(小端序 NBT) |
| 50 | 32 | 2 | Entity | NBT 复合根列表 - 实体数据(小端序 NBT) |
| 51 | 33 | 3 | PendingTicks | NBT 复合根列表 - 待处理刻数据(小端序 NBT) |
| 58 | 3A | : | RandomTicks | NBT 复合根列表 - 随机刻数据(小端序 NBT) |
世界状态与特性
11 种类| 十进制 | 十六进制 | ASCII | 名称 | 说明 |
|---|---|---|---|---|
| 52 | 34 | 4 | LegacyBlockExtraData | 条目数量(4 字节)+ 条目(键 4 字节、值 2 字节)。v1.2.13 之前用于雪层中的草。自 v1.2.13 起不再写入 |
| 53 | 35 | 5 | BiomeState | 区块生成用的生物群系状态信息 |
| 54 | 36 | 6 | FinalizedState | 4 字节:32 位小端整数,表示最终化状态 |
| 56 | 38 | 8 | BorderBlocks | 教育版特性 - 边界方块数据 |
| 57 | 39 | 9 | HardcodedSpawners | 结构生成的边界框信息,采用二进制格式存储 |
| 59 | 3B | ; | Checksums | 其他区块记录的 xxHash 校验和。自 v1.18.0 起不再写入 |
| 61 | 3D | = | MetaDataHash | 用于区块校验的元数据哈希 |
| 62 | 3E | > | GeneratedPreCavesAndCliffsBlending | 洞穴与山崖过渡前的融合数据 - 未使用 |
| 63 | 3F | ? | BlendingBiomeHeight | 生物群系高度融合数据 - 未使用 |
| 64 | 40 | @ | BlendingData | 用于地形生成过渡的世界融合数据 |
| 65 | 41 | A | ActorDigestVersion | 用于实体处理优化的摘要版本 |
旧版与弃用记录
2 种类| 十进制 | 十六进制 | ASCII | 名称 | 说明 |
|---|---|---|---|---|
| 55 | 37 | 7 | ConversionData | 世界转换数据 - 不再使用 |
| 118 | 76 | v | LegacyVersion | 1 字节旧版本号 - 在 v1.16.100 中迁移到标签 44 |
🎯 特殊数据库键
用于玩家数据、世界设置与游戏特性的非区块键。
玩家数据键
2 键~local_player
本地玩家实体数据,包含单个 NBT 复合根
player_
远程玩家数据,client ID 来自 clientid.txt(如 player_-12345678)
世界数据键
9 键game_flatworldlayers
ASCII 格式的平坦世界层配置(长度 20,例如长度 9 的 "[7,3,3,2]")
map_<#>
单个地图物品的数据
portals
下界传送门链接与坐标数据
structuretemplate
生成结构的模板数据
tickingarea
Ticking 区域的定义与边界
actorprefix*
实体管理用的 actor 前缀键
digp*
世界交互的持久化挖掘数据
map_*
制图相关的地图数据前缀
schedulerWT*
定时事件的世界刻调度数据
村庄系统键
4 键VILLAGE__DWELLERS
村民、铁傀儡与猫等居民数据
VILLAGE__INFO
包含边界框与属性的村庄信息
VILLAGE__POI
村民与床/工作站的兴趣点映射
VILLAGE__PLAYERS
玩家与村庄的交互与声誉数据
📄 level.dat 文件结构
基岩版的 level.dat 使用未压缩的 NBT 格式,小端序字节顺序,并带有 8 字节头部。
📋 文件头格式
🗂️ NBT 数据字段
玩家能力与权限
8 字段attackmobs
1 或 0(真/假)- 是否可攻击生物
attackplayers
1 或 0(真/假)- 是否可攻击玩家
build
1 或 0(真/假)- 是否可放置方块
doorsandswitches
1 或 0(真/假)- 是否可交互红石
flying
1 或 0(真/假)- 玩家当前是否在飞行
mayfly
1 或 0(真/假)- 玩家是否允许飞行
mine
1 或 0(真/假)- 是否可破坏方块
op
1 或 0(真/假)- 是否拥有管理员指令权限
世界设置与生成
7 字段Generator
世界类型:0=旧世界,1=无限世界,2=平坦
RandomSeed
世界生成种子
Difficulty
0=和平,1=简单,2=普通,3=困难
GameType
0=生存,1=创造,2=冒险,3=旁观
commandsEnabled
1 或 0(真/假)- 是否启用作弊
bonusChestEnabled
1 或 0(真/假)- 是否启用奖励箱
spawnMobs
1 或 0(真/假)- 是否允许生成生物
出生点坐标与维度
4 字段SpawnX
玩家出生点 X 坐标(默认 0)
SpawnY
玩家出生点 Y 坐标(默认 64)
SpawnZ
玩家出生点 Z 坐标(默认 0)
Dimension
当前维度:0=主世界,1=下界,2=末地
游戏规则与机制
8 字段keepinventory
死亡不掉落物品规则
mobgriefing
生物破坏规则
dodaylightcycle
昼夜循环规则
dofiretick
火焰蔓延规则
domobspawning
生物生成规则
doweathercycle
天气循环规则
naturalregeneration
自然回复规则
pvp
玩家对战规则
时间与天气数据
7 字段Time
当前时间刻(24000 刻为一天)
currentTick
当前游戏刻计数器
LastPlayed
上次游玩时间的 64 位 Q32.32 Unix 时间戳
rainLevel
当前降雨强度
rainTime
当前降雨剩余刻数
lightningLevel
当前雷暴强度
lightningTime
当前雷暴剩余刻数
版本与兼容性
5 字段StorageVersion
基岩版存储工具版本(目前为 10)
NetworkVersion
上次游玩版本的协议号
baseGameVersion
资源加载的最大版本(例如 1.16.0 会移除新特性)
lastOpenedWithVersion
上次打开版本的五个整数(如 [1, 20, 30, 22, 1])
MinimumCompatibleClientVersion
最低兼容客户端版本的五个整数(如 [1, 20, 30, 0, 0])
教育版特性
6 字段educationFeaturesEnabled
1 或 0(真/假)- 是否启用教育版功能
EducationOid
教育版机构标识的 UUID
EducationProductId
教育版授权的产品标识
eduOffer
教育版世界标记(值为 1 的世界无法在基岩版打开)
codebuilder
Code Builder/MakeCode 集成状态
immutableWorld
1 或 0(真/假)- 世界是否为只读
实验性特性
3 字段experiments_ever_used
1 或 0(真/假)- 世界是否锁定实验性玩法
saved_with_toggled_experiments
1 或 0(真/假)- 世界是否曾以实验性设置保存
enabled_features
该世界启用的实验性特性列表
多人游戏与网络设置
8 字段MultiplayerGame
1 或 0(真/假)- 是否启用“多人游戏”设置
MultiplayerGameIntent
1 或 0(真/假)- 是否打开“多人游戏”开关
LANBroadcast
1 或 0(真/假)- 是否开启“局域网可见”
LANBroadcastIntent
1 或 0(真/假)- 是否打开“局域网可见”开关
XBLBroadcastIntent
Xbox Live 可见性:0=禁用,1=仅邀请,2=仅好友,3=好友的好友
useMsaGamertagsOnly
1 或 0(真/假)- 是否仅允许微软账号玩家
Platform
平台标识(观察值:2)
PlatformBroadcastIntent
平台相关的广播设置
世界模板与商城
8 字段isFromWorldTemplate
1 或 0(真/假)- 是否从模板创建
isFromLockedTemplate
1 或 0(真/假)- 是否来自锁定模板(选项不可修改)
isWorldTemplateOptionLocked
1 或 0(真/假)- 是否在接受变更前锁定世界选项
prid
付费模板 UUID(商城世界)
hasLockedBehaviorPack
行为包锁定状态
hasLockedResourcePack
资源包锁定状态
texturePacksRequired
1 或 0(真/假)- 是否要求加入时使用材质包
ConfirmedPlatformLockedContent
1 或 0(真/假)- 是否包含平台专属内容
高级世界设置
8 字段NetherScale
下界坐标比例(默认 8):下界 X 方块 = 主世界 1 方块
worldStartCount
自世界创建以来的关闭次数(每次关闭减少 1)
serverChunkTickRange
区块处理的模拟距离
CenterMapsToOrigin
1 或 0(真/假)- 是否将地图中心对齐网格原点
startWithMapEnabled
1 或 0(真/假)- 新玩家是否携带定位地图
SpawnV1Villagers
1 或 0(真/假)- 生成 1.10.0 前村民
isCreatedInEditor
1 或 0(真/假)- 是否由基岩版编辑器创建
isExportedFromEditor
1 或 0(真/假)- 是否从基岩版编辑器导出
特殊数据结构
7 字段FlatWorldLayers
控制平坦世界生成的 JSON
BiomeOverride
将世界设为指定生物群系的单一生物群系
InventoryVersion
背包系统版本标识
world_policies
世界级政策设置
eduSharedResource
教育版共享资源配置(包含 buttonName 与 linkUri)
IsHardcore
1 或 0(真/假)- 是否为硬核模式
IsSingleUseWorld
1 或 0(真/假)- 未使用,可能导致一次性世界删除
🔄 NBT 格式差异
基岩版与 Java 版 NBT 数据格式的关键差异。
🔵 基岩版 NBT
- 字节序:小端序
- 整数存储:多字节整数为小端序
- 字符串长度:小端序长度前缀
- 压缩:数据库内使用 Zlib 压缩
- 用途:实体、方块实体、待处理刻记录
🟠 Java 版 NBT
- 字节序:大端序
- 整数存储:多字节整数为大端序
- 字符串长度:大端序长度前缀
- 压缩:区域文件使用 Gzip 压缩
- 用途:Anvil 区域文件与 level.dat
⚠️ 转换警告
由于字节序不同,Java 与基岩版的 NBT 数据无法直接兼容。跨平台存档转换需要专用工具。
🛠️ 开发者工具与资源
用于处理基岩版存档格式与 LevelDB 数据库的核心工具与库。
LevelDB 库
用于访问 LevelDB 的编程库:
- Mojang LevelDB:官方修改版,包含 Zlib
- leveldb-mcpe-java:支持压缩的 Java 实现
- Python leveldb:Python 数据库访问绑定
- Node.js leveldown:JavaScript LevelDB 绑定
世界编辑器
用于编辑基岩版世界的工具:
- Amulet Editor:跨平台世界编辑器
- MCC Tool Chest:基岩版专用编辑器
- Blocktopograph:移动端世界查看/编辑
- Universal Minecraft Editor:多格式编辑器
分析工具
数据库检查与调试:
- LevelDB dump:数据库内容探索
- NBT 解析器:小端序 NBT 读取
- 区块分析器:键格式解码
- 性能分析:数据库优化工具
转换工具
格式转换与迁移:
- Java 转基岩转换器:跨版本世界迁移
- NBT 格式转换器:端序转换
- 结构导出工具:跨平台建筑转换
- 世界优化工具:数据库清理与修复
📋 LOG 文件格式
LevelDB 会在 db/ 目录中生成 LOG 文件,用于记录数据库操作与压缩过程。
📍 文件位置
LOG 文件位于基岩版世界的 /db 路径:
worlds/YourWorldName/db/LOGworlds/YourWorldName/db/LOG.old
用途: LevelDB 格式的一部分,用于 LDB 文件压缩之间的记录
📄 日志格式
每条日志遵循固定格式:
YYYY/MM/DD-Hour:Minute:Second.Microseconds ProcessID "Operation"
组成:
- 日期/时间:操作发生时间
- 进程 ID:十六进制进程标识
- 操作:数据库操作描述
📊 日志示例
2014/07/24-22:20:08.400488 4a3638 Recovering log #3
数据库恢复操作
2024/09/04-11:45:12.123456 2f1a8c Compaction started
数据库压缩过程开始
2024/09/04-11:45:15.789012 2f1a8c Level-0 compaction finished
压缩过程完成
🔧 常见操作
- Recovering log:数据库启动与恢复
- Compaction:数据库优化与清理
- Level operations:LSM 树层级管理
- File operations:SSTable 文件创建/删除
- Manifest updates:数据库元数据更新
🛠️ 使用 LOG 文件排错
🔍 损坏检测
关注关于损坏块或校验和无效的错误信息
⚠️ 恢复问题
检查未能成功完成的 “Recovering log” 记录
💾 空间问题
观察压缩操作是否出现磁盘空间或性能异常
🔒 锁定问题
识别导致世界无法打开的数据库锁定问题
✅ 最佳实践与安全指南
处理基岩版世界数据库与存档文件时必须遵循的安全实践。
安全第一
- 始终备份世界后再进行任何修改
- 在副本上测试,不要直接操作原始世界
- 确认工具兼容当前基岩版版本
- 编辑数据库前彻底关闭 Minecraft
- 修改后检查文件完整性
技术规范
- 使用正确的字节序读取与写入 NBT 数据
- 保持键格式一致,避免新增区块数据失配
- 正确处理压缩以读取 Zlib 压缩值
- 注意版本兼容不同基岩版发布
- 校验区块坐标与维度 ID
性能建议
- 批量操作数据库提高效率
- 正确关闭连接避免锁定
- 监控数据库大小并定期清理
- 大型操作使用合适工具
- 评估修改性能影响
🔄 版本兼容性
基岩版存档格式会随更新演进。请始终确认工具、世界存储版本与当前基岩版版本之间的兼容性。部分特性与键类型为版本专用,可能无法跨版本使用。