一、安装
git clone https://github.com/weiyanwei412/rdb_bigkeys.git
cd rdb_bigkeys
go mod init rdb_bigkeys
go mod tidy
go build
# 运行解析
./rdb_bigkeys --bytes 1024 --file bigkeys_6379.csv --sep 0 --sorted --threads 2 dump.rdb
二、故障原因
1.运行报错
panic: rdb: invalid RDB version number 9
2.报错原因
报错原因主要是因为代码对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按钮集合

2.更改自己的rdb项目的decoder.go文件
注释632-635行,然后提交变更,这里我感觉这里的version校验没有任何意义,且我的go还不太熟悉,所以这里接直接注释了,如果你有更好的办法也可以自己改
//version, _ := strconv.ParseInt(string(header[5:]), 10, 64)
//if version < 1 || version > 7 {
// return fmt.Errorf("rdb: invalid RDB version number %d", version)
//}
3.更改rdb_bigkeys下的rdb_bigkeys.go文件
//这里把github.com/cupcake/rdb变成了github.com/database-on-line/rdb。你可以用自己账号下的rdb,用我这个也可以
package main
import (
"bufio"
"flag"
"fmt"
"os"
"strings"
"sync"
"github.com/database-on-line/rdb"
)
4.重新build一遍
rm go.sum
rm go.mod
go clean -modcache
go mod init rdb_bigkeys
go mod tidy
go build
方式二:
1.修改已经下载好的moudle文件
# 一般的module路径
cd $GOPATH/pkg/mod/
# 如果使用yum等安装的,一般是在下面的路径
cd ~/go/pkg/mod/
# 修改decoder.go文件,如方式一中的步骤二一样
2.删除变异文件重新build
# 进入到项目目录
cd rdb_bigkeys
# 删除已经编译好的文件
rm rdb_bigkeys
# 重新build
go build
这样下来就可以正常的运行了

1833

被折叠的 条评论
为什么被折叠?



