youbbs
youbbs
4288 0 0

Golang leveldb 热备份方法

Golang 实现的 leveldb 数据库没有内置热备份方法,可以曲线实现,使用 iterator.Iterator + leveldb.Batch 组合实现,速度很快。

下面是使用这种方法实现备份的日志,8万5千多条用时 300毫秒左右。

2021/03/22 17:20:50 databackup done 85714 85714 277.902156ms
2021/03/23 17:24:33 databackup done 85771 85771 307.730425ms
2021/03/24 17:24:32 databackup done 85782 85782 290.483576ms
2021/03/25 17:24:33 databackup done 85778 85778 261.970037ms
2021/03/26 17:24:32 databackup done 85837 85837 261.507141ms
2021/03/27 17:24:32 databackup done 85760 85760 287.523311ms

核心代码:

batchNum := 500 // 批量写条数
iter := db.NewIterator(nil, nil)
ic := 0 // 计数
batch := new(leveldb.Batch)
for iter.Next() {
	if batch.Len() > 0 && (ic%batchNum) == 0 {
		err = db2.Write(batch, &opt.WriteOptions{Sync: true})
		if err != nil {
			return
		}
		batch = new(leveldb.Batch)
	}
	batch.Put(iter.Key(), iter.Value())
	ic++
}
if batch.Len() > 0 {
	err = db2.Write(batch, &opt.WriteOptions{Sync: true})
	if err != nil {
		return
	}
}

iter.Release()
err = iter.Error()
if err != nil {
	return
}
  • db 是在线数据库连接;
  • db2 是临时新建数据连接。

如果数据量很大或数据 value 长度大,可根据机器内存调整 batchNum,效果可能会更好。

问题

  • 为什么不直接拷贝文件?你怎么看
0

See Also

Nearby


Discussion

Login Topics