youbbs avatar

Golang leveldb 热备份方法

🕛 by youbbs

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

Golang leveldb 热备份方法

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

plaintext: leveldb 热备份日志
1
2
3
4
5
6
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

核心代码:

Go: leveldb 热备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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, nil)
		if err != nil {
			return
		}
		batch = new(leveldb.Batch)
	}
	batch.Put(iter.Key(), iter.Value())
	ic++
}
if batch.Len() > 0 {
	err = db2.Write(batch, nil)
	if err != nil {
		return
	}
}

iter.Release()
err = iter.Error()
if err != nil {
	return
}

  • db 是在线数据库连接;
  • db2 是临时新建数据连接。

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

问题

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

💘 相关文章

写一条评论

Based on Golang + fastHTTP + sdb | go1.16.3 Processed in 0ms