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
,效果可能会更好。
- goleveldb https://github.com/syndtr/goleveldb
问题
- 为什么不直接拷贝文件?你怎么看
0
See Also
- 用Golang快速、安全、可靠的做系统备份,只需几分钟即可完成设置
- Golang boltdb 与 leveldb 的读写性能比较
- 使用WebRTC+Websockets+Golang 在网站上进行视频聊天
- LMDB: Leveldb 的终结者?
- 成本最低的SEO投入方法