rocksdb-doc-cn

概述

修复器允许在灾难之后, 在对一致性没有任何妥协的情况下,尽最大努力来修复尽可能多的数据。他不能保证把数据库恢复到一个抑制状态的时间点。

使用

注意CLI命令使用默认选项来修复你的DB,并且只增加在SST文件中找到的列族。如果你需要指定选项,比如,自定义的比较器,或者有根据列族不同的选项,或者希望声明额外的列族集合,你需要自己编写相关代码。

自行编写

为了自己编写代码,调用 include/rocksdb/db.h 中声明的其中一个RepairDB函数

CLI

对于命令行使用方式,首先构建ldb,我们的管理员CLI工具:

$ make clean && make ldb

现在使用ldb的 repaire 子命令,指明你的DB。注意他打印info日志到stderr,所以你可能希望重定向他。这里我在一个./tmp目录下的DB运行它,在这里,我不小心删除了MANIFEST文件:

$ ./ldb repair --db=./tmp 2>./repair-log.txt
$ tail -2 ./repair-log.txt 
[WARN] [db/repair.cc:208] **** Repaired rocksdb ./tmp; recovered 1 files; 926bytes. Some data may have been lost. ****
Looks successful. MANIFEST file is back and DB is readable:
$ ls tmp/
000006.sst  CURRENT  IDENTITY  LOCK  LOG  LOG.old.1504116879407136  lost  MANIFEST-000001  MANIFEST-000003  OPTIONS-000005
$ ldb get a --db=./tmp
b

注意lost/目录。他持有所有可能在恢复过程中丢失的数据文件。

修复过程

修复过程分为4步:

查找文件

修复器遍历当前目录所有文件,然后根据他们的文件名进行分类。任何无法分类的文件都会被忽略

把日志转化为表

每个活跃的日志文件都会被重放。该文件中所有校验和不通过的节都会被跳过。我们有意保留一致的数据。

导出metadata

我们扫描所有的表,以计算:

如果我们无法扫描文件,我们忽略这个表

写描述符

我们生成描述符内容:

可能的优化

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账