tidb load data file 失败_TiDB 表元数据修复指南

作者介绍:邰凌翔 (AilinKid),TiDB 研发工程师,珞珈图腾数据库实验室学员。

DDL SIG Community:主要涵盖 TiDB 语法分析器、异步 DDL Online 执行框架、字符集 Collation 的支持、Meta data 元数据管理等。

TiDB 是一款基于新型架构和语言,敏捷开发迭代的产品,在发现问题的同时,快速应对和解决问题是我们的特色。在生产和升级时,为了规避意外情况导致的元数据错误,TiDB 提供了元数据修复手段 Admin Repair Table 来比对和重新构建新的元数据信息。

本文后续将以基础架构背景为由,以一个实际例子为链路,详细介绍在 TiDB 中如何对表元数据进行恢复,希望能给广大使用者带来帮助。

背景

TiDB 是一款计算存储分离的数据库,Meta 和 Data 都是以 KV 存在存储节点上的。当谈到 Meta 元数据修复的时候,一般会想到两种方式:

1. 直接在计算层通过 SQL 的方式,重新写入新的 Meta。

2. 直接在存储层直接通过 KV 的方式,重新写入编码好的 Meta KV。

对于 2 来说,所需要的转化和 encode 工作比较多,一个符合规范的 Meta KV 在构建时候需要很多的检查,比如列名是不是符合规范,是不是支持的 MySQL 类型,Index 是不是构建在了不存在的列上等等。企图通过 Raw KV 的方式写入 Meta 本质上也需要用户手动过一下 SQL 层那些检查逻辑,才能保证正确性。

考虑到 MySQL 也有类似通过 repair table SQL 的方式来修复 MyISAM 上的 Meta 数据,因此,TiDB 考虑直接在 SQL 层通过新的 Create Table 语句来构建对应的新 Meta 信息。由此可以经过完整的语法解析、约束检查、冲突检测,最后编码成符合规范的 Meta KV 替换掉存储层上面损坏的 Meta 信息。

示例

下面以一个例子作为开端,从具体需求引入该解决方案,由此可见一斑。

在我们的一个 Oncall 中,用户将他们的集群从 v3.0.3 之前的版本升级到了 v4.0 GA 的时候,发生了 Meta 上的限制错误,导致集群无法启动。从本质上看,是在启动时候创建分区表的时候产生的故障。

create table t(
a date
...
) partition by range columns(a)
partition p1 values le
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值