TiDB表覆盖恢复失败

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
备份一张表t得到备份集s,然后对表t中的数据做一定修改,再用s对表t进行恢复将导致失败。但是若将数据库中的表t删除,那么将可以用备份集s将表t进行恢复。

【遇到的问题:问题现象及影响】
TiDB数据库中进行表的覆盖恢复失败,具体报错信息如下:

[2024/11/19 09:33:15.598 +00:00] [ERROR] [restore.go:64] [“failed to restore”] [error=“failed to validate checksum: [BR:Restore:ErrRestoreChecksumMismatch]restore checksum mismatch”] [errorVerbose=“[BR:Restore:ErrRestoreChecksumMismatch]restore checksum mismatch\nfailed to validate checksum\ngithub.com/pingcap/tidb/br/pkg/restore.(*Client).execChecksum\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/pkg/restore/client.go:1742\ngithub.com/pingcap/tidb/br/pkg/restore.(*Client).GoValidateChecksum.func2.2\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/pkg/restore/client.go:1655\ngithub.com/pingcap/tidb/br/pkg/utils.(*WorkerPool).ApplyOnErrorGroup.func1\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/pkg/utils/worker.go:76\ngolang.org/x/sync/errgroup.(*Group).Go.func1\n\t/go/pkg/mod/golang.org/x/sync@v0.1.0/errgroup/errgroup.go:75\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1598”] [stack=“main.runRestoreCommand\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/cmd/br/restore.go:64\nmain.newTableRestoreCommand.func1\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/cmd/br/restore.go:196\ngithub.com/spf13/cobra.(*Command).execute\n\t/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:916\ngithub.com/spf13/cobra.(*Command).ExecuteC\n\t/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:1044\ngithub.com/spf13/cobra.(*Command).Execute\n\t/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:968\nmain.main\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/cmd/br/main.go:58\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250”]
[2024/11/19 09:33:15.598 +00:00] [ERROR] [main.go:60] [“br failed”] [error=“failed to validate checksum: [BR:Restore:ErrRestoreChecksumMismatch]restore checksum mismatch”] [errorVerbose=“[BR:Restore:ErrRestoreChecksumMismatch]restore checksum mismatch\nfailed to validate checksum\ngithub.com/pingcap/tidb/br/pkg/restore.(*Client).execChecksum\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/pkg/restore/client.go:1742\ngithub.com/pingcap/tidb/br/pkg/restore.(*Client).GoValidateChecksum.func2.2\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/pkg/restore/client.go:1655\ngithub.com/pingcap/tidb/br/pkg/utils.(*WorkerPool).ApplyOnErrorGroup.func1\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/pkg/utils/worker.go:76\ngolang.org/x/sync/errgroup.(*Group).Go.func1\n\t/go/pkg/mod/golang.org/x/sync@v0.1.0/errgroup/errgroup.go:75\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1598”] [stack=“main.main\n\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/br/br/cmd/br/main.go:60\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:250”]

官方文档中只是说明了不支持集群粒度的覆盖恢复,并未说明不允许进行表粒度的覆盖恢复,请问这个是合理的现象吗?

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

建议提供你操作的具体的命令,以及数据库版本

你备份的表例如是截至10点钟的数据,你库中的表在11点修改了数据,你想恢复,只能把表删了用备份还原到10点钟啊,你表不删,表里面很多没动的数据不是重复的吗?你的最终目的是什么呢?

br只能在空库空表中进行恢复,不然会报ChecksumMismatch错误。

覆盖是一个多危险的操作啊🤔,就算能覆盖,生产不建议这么玩

br恢复空表或者表不存在,才能恢复成功;若表中有数据,则会报错

这需求很危险啊,直接覆盖。
建议:将修改后的表rename,然后将备份的进行恢复,这样更好。

br只能空表或者空库恢复,有数据的不支持

br和TiDB的版本都是v7.1.0, 恢复命令如下:
/root/.tiup/components/br/v7.1.0/br restore table --db test --table table_01 --pd “127.0.0.1:2379” --storage “…” --s3.endpoint=…

我是这样理解的:
1.官方文档只是提到集群的恢复必须是新的集群,没有明确指出表或者库的恢复不允许覆盖,我原来理解默认是支持的(现在看来默认不支持覆盖操作),当然我认可覆盖是一种危险操作。
2.具体需求场景我认为也是有的,如果在某些情况下数据库中的数据被更改了并且不符合预期,就可以直接覆盖,因为像oracle数据库的表恢复也是提供了参数table_exists_action=replace支持覆盖恢复。

统一回复:
谢谢各位朋友的解答,我请教大家的问题已经有了答案:BR工具默认是不支持对集群、数据库或者表的覆盖恢复。
另外我试图在BR手册中查找支持覆盖的参数(类似于oracle数据库的table_exists_action=replace), 但是BR并未提供此类参数以支持覆盖恢复。