⬇️以下是 cmd/geth 包中其他代码的介绍:
├── accountcmd.go
├── chaincmd.go
├── config.go
├── consolecmd.go
├── dbcmd.go 🔫
├── misccmd.go
├── snapshot.go
├── usage.go
└── version_check.go
《深入学习 Go-Ethereum : 010. CMD 模块 - Geth - consolecmd.go》中罗列了 consolecmd 主要源码,接下来描述下关于 dbcmd.go 中的代码功能。
dbcmd 会依赖 go-ethereum 项目源码中
"github.com/ethereum/go-ethereum/cmd/utils"、 "github.com/ethereum/go-ethereum/common"、 "github.com/ethereum/go-ethereum/common/hexutil"、 "github.com/ethereum/go-ethereum/console/prompt"、 "github.com/ethereum/go-ethereum/core/rawdb"、 "github.com/ethereum/go-ethereum/core/state/snapshot"、 "github.com/ethereum/go-ethereum/core/types"、 "github.com/ethereum/go-ethereum/ethdb"、 "github.com/ethereum/go-ethereum/log"、 "github.com/ethereum/go-ethereum/trie" 相关组件。
dbcmd 主要功能是操作levelDB(一个本地的 Key-Value 数据库),代码主要包含了 db 命令和 13 个子命令及实现相应功能的函数。

geth db --help 查看子命令列表及简介

查看 db 统计信息

删除数据库中数据 geth removedb

再次查看数据库,不存在数据库文件

代码主逻辑⬇️:

提醒用户确认并删除数据文件⬇️

主要作用是检查当前数据库中的数据分布,代码如下图⬇️,主要逻辑处理 rawdb.InspectDatabase() 。

对比参数查询结果:左侧是有前缀参数、右侧无参数(全数据库) 。

主要作用查询数据库存储状态,其中最重要的代码逻辑是
db.Stat()→ethdb/leveldb/leveldb.go 代码中的 db.db.GetProperty() →
leveldb/db.go 代码中的 GetProperty(),获取levelDB的统计数据

Compact 主要作用「压缩」数据,对指定范围 start ,limit 两个参数范围内的数据进行处理,本质上是对 删除的 数据和不再使用的版本数据 进行重排序。(⚠️:此方法会花费较长时间。同时对数据进行加锁)
db.Compact()→ethdb/leveldb/leveldb.go 代码中的 db.db.CompactRange() →
leveldb/db_write.go 代码中的 CompactRange(),进行数据压缩处理

主要是使用 levelDB 的 db.go 进行操作。

指定根节点进行数据导出操作。

导出”冷数据“,指定导出的数据类型,开始数据 index,和结束数据 index。
数据类型参数范围是[bodies diffs hashes headers receipts]

通过下面命令进行 “凉凉“ 数据进行 dump 操作。

导入指定文件(以RLP格式进行快照)数据到 eth.Database ,如果是 gz 文件会通过 gzip 进行文件操作。
// ImportLDBData imports a batch of snapshot data into the database 可以查看 utils.ImportLDBData() 具体实现

与 import 对应的方法就是数据的导出。导出需要指定数据是preimage还是snapshot,此外需要指定导出文件名及文件后缀名,如果是gz格式,程序会使用gzip进行文件压缩。
调用ExportChaindata()进行数据文件生成

显示levelDB相关元数据信息,比如数据库版本、头信息、快照信息等

迁移”冷数据“,到指定表中「receipts」

以上是dbcmd中代码的主要功能。底层依赖ethdb进行操作KV数据库leveldb。

