之前使用三节点的数据库集群,因为运维方说有滚动的硬盘数据备份,所以只做了每日的导出备份,结果因断电硬盘直接坏了,然后发现备份的数据直接是硬盘镜像,而且不是同一个时间点备份的,出现三个节点硬盘数据完全不同的情况,完全无法启动。
客户又想要尽可能最新的数据,只有研究了官方的源码解读和存储说明,从TiKV底层的RocksDB数据文件直接读数据导出来了。(单个TiKV节点的数据文件是好的,但不同节点的数据完全对不上,TiDB启动就报错,可能已经出现一些Region合并啥的操作了)
最近练手Rust,写了个直接从RocksDB导出数据库列表、数据库表列表,以及导出对应表的工具,有类似场景的同学说不准哪天也能用上,不用像我之前那么紧张了!
代码地址,CentOS7+GCC7编译了一个版本,其它版本大家自己编译吧。
https://github.com/goalzz85/tidb-exporter
原理大概就是下面如图,直接从RocksDB导出数据,毕竟是灾难情况导出,就没有管Region是否leader了,只要是里边的数据,都会导出,如果是3节点的,理论上导出的是全量数据,已经试过10亿级别的表了。
2 个赞
也是引用了官方不少库,翻译了些Go语言的代码结构过来,放弃低版本的一些存储结构了。数据读取方式按自己理解来的,大概就是同主键,最新一条为主,有delete如果是最新一条,就当被删了,只是自己验证了下数据还行,但不确保所有条件分支都是覆盖到的,想的是能拿到数据就不错了,哈哈。
1 个赞
zhanggame1
(Ti D Ber G I13ecx U)
2023 年11 月 20 日 05:17
8
牛。
不过数据库用硬盘镜像备份那个叫冷备,只能关库备份
1 个赞
嗯,我了解它那个是云底层的一个备份机制,不影响系统正常运行,但不是一起备,是排队一台一台的备份,所以每个节点的数据文件完全不一样。
github上有个release,下载里边的:
tidb-exporter-v740-x86_64-unknown-linux-gnu.tar.gz
现在只在centos7 + gcc7编译了Linux可执行文件,如果依赖有问题就需要自己编译一下了。
使用方式 --help 看一下,主要就是tikv的存储文件路径,数据库,要导出的表,导出路径就可以了。
鱼126
2023 年11 月 21 日 09:13
17
可以了,有个问题,我能查出 都有哪些库来,要查具体的库里面的表,就报错: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故障,是不是就不能查了?
鱼126:
能查出 都有哪些库来,要查具体的库里面
我先确认下你的TiDB版本是什么?如果是文件直接损坏是不行的,本身数据就已经乱了。这个软件暂时使用场景是服务器出现元信息异常,或者服务无法正常启动工作时候,能从底层文件里边拷贝出数据来,但前提是基础文件是好的。
鱼126:
4.0.4,有个region损坏
我默认是基于7.1版本来进行编译的了,自己5.x和7.4版本测过,不确定你是文件损坏还是只是region损坏,如果数据不敏感可以发上来或者邮箱给我看看,我抽空排查下是否是可以支持的。