一个单节点部署的集群,部署时,没有开始binlog,扩容pump、drainer,并开起binlog后,发现有些库的表无法通过where条件筛选出来

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:tidb 4.0.0
  • 【问题描述】:一个单节点部署的集群,部署时,没有开始binlog,扩容pump、drainer,并开起binlog后,发现有些库的表无法通过where条件筛选出来。

过程描述:
1、一个测试的单节点集群,使用tiup部署4.0.0。
2、默认没有开始binlog,所以想测试开启binlog。扩容的yaml如下:
server_configs:
tidb:
binlog.enable: true
binlog.ignore-error: true
pump_servers:

  • host: 10.4.0.32
    ssh_port: 22
    port: 8250
    deploy_dir: “/data/tidb-deploy/pump-8249”
    data_dir: “/data/tidb-data/pump-8249”
    config:
    gc: 14
    drainer_servers:
  • host: 10.4.0.32
    ssh_port: 22
    port: 8249
    data_dir: “/data/tidb-data/drainer-8249”
    commit_ts: -1
    deploy_dir: “/data/tidb-deploy/drainer-8249”
    config:
    syncer.db-type: “file”
    syncer.to.dir: “test.sql”
    arch: amd64
    os: linux

3、扩容后,发现有个库的表(如包含有A、B字段),where无法通过A筛选出现,但可以通过B筛选出来。


4、怀疑是索引出了问题,就把该表与A相关的索引删除。删除后,where就可以通过A筛选出来了。

请问做扩容pump、drainer,开启binlog的操作会引起索引的数据丢失吗?

请问是否将存量的数据导入到下游了呢?binlog 只会同步增量的数据。

请看我的部署配置。
仅做binlog,应该不会有数据的导入操作吧?

请在明示下上面截图的意思,这边理解的是,member id 在启用 tidb binlog 之后查询出现的出入。

可以执行下 admin check table tbl_name 看下结果,请在 shell 中执行。

上面的截图的意思是:
第一张图,确认users表中,member_id的确有这条数据。
第二张图,查询users表时,通过member_id查不到这条数据。
这即验证了,users表里,无索引的字段是可以筛选的,但有索引的字段,筛选不出来。证明索引有问题。

后面我们把member_id相关的索引删除后,通过member_id也可以搜索数据了。

和 tidb binlog 没有直接关系。

如果当前环境已经破坏,通过 alter table add index 重新添加索引可能就不存在这个问题了。

请问上面的 admin check table 是否已经执行?

explain 看下搜索不到 member id 的 select 的执行计划,