github官网
https://github.com/weiyanwei412/rdb_bigkeys
在centos下安装go
[root@hadoop102 rdb_bigkeys-master]# wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
[root@hadoop102 rdb_bigkeys-master]# tar -zxf go1.13.5.linux-amd64.tar.gz -C /usr/local
将go添加到环境变量
export GO111MODULE=on
export GOROOT=/usr/local/go
export GOPATH=/home/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
保存退出后使用环境变量生效
source /etc/profile
初始化go
go mod init 【module名】
[root@hadoop102 redis_bigkey]# go mod init rdb_bigkeys-master
换一个中国的proxy,不然go get会报错
go env -w GOPROXY=https://goproxy.cn
编译
go get
go build
编译出了可执行文件
[root@hadoop102 rdb_bigkeys]# ./rdb_bigkeys --bytes 1024 --file bigkeys.csv --sep 0 --sorted --threads 4 dump.rdb
每列分别为数据库编号,key类型,key名,key大小,元素数量,最大值元素名,元素大小,key过期时间。
rdb-bigkeys 在高版本的 rdb文件不能使用,我的redis 6 报错不能分析
panic: rdb: invalid RDB version number 9
报错原因
报错原因主要是因为代码对rdb解析的时候获取版本的处理有问题
我们看下代码
# 619行-636行
func (d *decode) checkHeader() error {
header := make([]byte, 9)
_, err := io.ReadFull(d.r, header)
if err != nil {
return err
}
if !bytes.Equal(header[:5], []byte("REDIS")) {
return fmt.Errorf("rdb: invalid file format")
}
//可以看到这里面取的是header[5:],而我们cat一个dump.rdb,可以发现其内部数据是这样REDIS0009� redis-ver6.0.10�,所以这里真实的版本是6,但是取的版本号是9,所以会有这个报错
version, _ := strconv.ParseInt(string(header[5:]), 10, 64)
if version < 1 || version > 7 {
return fmt.Errorf("rdb: invalid RDB version number %d", version)
}
return nil
}
解决方案
1.fork项目
将github.com/cupcake/rdb的项目fork到自己的github账户下,只需要在github上对应项目界面点击fork按钮集合
更改自己的rdb项目的decoder.go文件
注释630-634行,然后提交变更,这里我感觉这里的version校验没有任何意义,所以这里接直接注释了,如果你有更好的办法也可以自己改
fork到自己仓库注释掉下面四行
更改rdb_bigkeys下的rdb_bigkeys.go文件
重新进行build
rm -rf go.sum
rm -rf go.mod
go clean -modcache
go mod init rdb_bigkeys
go mod tidy
go build