# 深入学习 Go-Ethereum : 011. CMD 模块 - Geth -dbcmd.go **Published by:** [OutOfToken](https://paragraph.com/@lua/) **Published on:** 2022-07-21 **URL:** https://paragraph.com/@lua/go-ethereum-011-cmd-geth-dbcmd-go ## Content ⬇️以下是 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.godbcmd 主要功能是操作levelDB(一个本地的 Key-Value 数据库),代码主要包含了 db 命令和 13 个子命令及实现相应功能的函数。dbcmd.go 代码结构geth db --help 查看子命令列表及简介⬇️ removeDB 方法:查看 db 统计信息删除数据库中数据 geth removedb再次查看数据库,不存在数据库文件代码主逻辑⬇️:removedb 命令对应的方法提醒用户确认并删除数据文件⬇️内部方法,提醒用户确认并删除文件⬇️ inspect 方法:主要作用是检查当前数据库中的数据分布,代码如下图⬇️,主要逻辑处理 rawdb.InspectDatabase() 。inspect 命令对应的方法对比参数查询结果:左侧是有前缀参数、右侧无参数(全数据库) 。使用效果对比⬇️ dbStats 方法:主要作用查询数据库存储状态,其中最重要的代码逻辑是db.Stat() →ethdb/leveldb/leveldb.go 代码中的 db.db.GetProperty() →leveldb/db.go 代码中的 GetProperty(),获取levelDB的统计数据dbStates方法代码截图⬇️ dbCompact 方法:Compact 主要作用「压缩」数据,对指定范围 start ,limit 两个参数范围内的数据进行处理,本质上是对 删除的 数据和不再使用的版本数据 进行重排序。(⚠️:此方法会花费较长时间。同时对数据进行加锁)db.Compact() →ethdb/leveldb/leveldb.go 代码中的 db.db.CompactRange() →leveldb/db_write.go 代码中的 CompactRange(),进行数据压缩处理dbCompact方法代码截图⬇️ dbGet、dbDelete、dbPut 方法:主要是使用 levelDB 的 db.go 进行操作。⬇️ dbDumpTrie 方法:指定根节点进行数据导出操作。dbDumpTrie方法代码截图⬇️ freezerInspect 方法:导出”冷数据“,指定导出的数据类型,开始数据 index,和结束数据 index。 数据类型参数范围是[bodies diffs hashes headers receipts]通过下面命令进行 “凉凉“ 数据进行 dump 操作。操作示例⬇️ importLDBdata 方法:导入指定文件(以RLP格式进行快照)数据到 eth.Database ,如果是 gz 文件会通过 gzip 进行文件操作。 // ImportLDBData imports a batch of snapshot data into the database 可以查看 utils.ImportLDBData() 具体实现⬇️ exportChaindata 方法:与 import 对应的方法就是数据的导出。导出需要指定数据是preimage还是snapshot,此外需要指定导出文件名及文件后缀名,如果是gz格式,程序会使用gzip进行文件压缩。 调用ExportChaindata()进行数据文件生成exportChaindata方法⬇️ showMetaData 方法:显示levelDB相关元数据信息,比如数据库版本、头信息、快照信息等showMetaData方法⬇️ freezerMigrate 方法:迁移”冷数据“,到指定表中「receipts」以上是dbcmd中代码的主要功能。底层依赖ethdb进行操作KV数据库leveldb。 ## Publication Information - [OutOfToken](https://paragraph.com/@lua/): Publication homepage - [All Posts](https://paragraph.com/@lua/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@lua): Subscribe to updates - [Twitter](https://twitter.com/HetaoFei): Follow on Twitter