不启动服务-直接从节点TiKV数据文件中导出数据应对极端情况

之前使用三节点的数据库集群,因为运维方说有滚动的硬盘数据备份,所以只做了每日的导出备份,结果因断电硬盘直接坏了,然后发现备份的数据直接是硬盘镜像,而且不是同一个时间点备份的,出现三个节点硬盘数据完全不同的情况,完全无法启动。

客户又想要尽可能最新的数据,只有研究了官方的源码解读和存储说明,从TiKV底层的RocksDB数据文件直接读数据导出来了。(单个TiKV节点的数据文件是好的,但不同节点的数据完全对不上,TiDB启动就报错,可能已经出现一些Region合并啥的操作了)

最近练手Rust,写了个直接从RocksDB导出数据库列表、数据库表列表,以及导出对应表的工具,有类似场景的同学说不准哪天也能用上,不用像我之前那么紧张了!

代码地址,CentOS7+GCC7编译了一个版本,其它版本大家自己编译吧。
https://github.com/goalzz85/tidb-exporter

原理大概就是下面如图,直接从RocksDB导出数据,毕竟是灾难情况导出,就没有管Region是否leader了,只要是里边的数据,都会导出,如果是3节点的,理论上导出的是全量数据,已经试过10亿级别的表了。

2 个赞

这么6 :100:

:blush:也是引用了官方不少库,翻译了些Go语言的代码结构过来,放弃低版本的一些存储结构了。数据读取方式按自己理解来的,大概就是同主键,最新一条为主,有delete如果是最新一条,就当被删了,只是自己验证了下数据还行,但不确保所有条件分支都是覆盖到的,想的是能拿到数据就不错了,哈哈。

1 个赞

cool :+1: :+1: :+1:

1 个赞

:+1: :+1: :+1:
希望我用不到。

1 个赞

:+1: :+1: :+1:

1 个赞

牛,官方就缺这么个工具

1 个赞

牛。
不过数据库用硬盘镜像备份那个叫冷备,只能关库备份

1 个赞

一样,希望大家都用不到,用到就是很坑的时候了

嗯,我了解它那个是云底层的一个备份机制,不影响系统正常运行,但不是一起备,是排队一台一台的备份,所以每个节点的数据文件完全不一样。

这也太牛了吧。。。

1 个赞

:+1: :+1: :+1:

1 个赞

所以只能冷备,停库备份才能保证备份一致性

1 个赞

献上大拇哥

1 个赞

怎么使用,下载的tar包,没有可执行文件

github上有个release,下载里边的:
tidb-exporter-v740-x86_64-unknown-linux-gnu.tar.gz

现在只在centos7 + gcc7编译了Linux可执行文件,如果依赖有问题就需要自己编译一下了。

使用方式 --help 看一下,主要就是tikv的存储文件路径,数据库,要导出的表,导出路径就可以了。

可以了,有个问题,我能查出 都有哪些库来,要查具体的库里面的表,就报错:thread ‘main’ panicked at ‘called Result::unwrap() on an Err value: CorruptedData(“parse table info error”)’, src/main.rs:125:69
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

如果物理文件,某个region故障,是不是就不能查了?

我先确认下你的TiDB版本是什么?如果是文件直接损坏是不行的,本身数据就已经乱了。这个软件暂时使用场景是服务器出现元信息异常,或者服务无法正常启动工作时候,能从底层文件里边拷贝出数据来,但前提是基础文件是好的。

v4.0.4,有个region损坏

我默认是基于7.1版本来进行编译的了,自己5.x和7.4版本测过,不确定你是文件损坏还是只是region损坏,如果数据不敏感可以发上来或者邮箱给我看看,我抽空排查下是否是可以支持的。