0
0
0
0
博客/.../

br log 备份失败,不使用指定的tso,一直获取遗留的日志备份的tso

 克里克里克  发表于  2026-08-03

问题简介

br log备份时指定原始的日志备份目录,当前目录保留有已经stop的 日志备份信息,正常启动新任务(指定--start-ts),br一直使用遗留的tso,不是--start-ts指定的信息,导致启动任务失败。

环境说明

问题详细说明

当前备份目录信息

[tidb@tidb-01 tempdir]$ ll /data/tidb/logbackup/

总用量 12

-rw-r--r-- 1 tidb tidb 78 7月 13 17:17 backup.lock

-rw-r--r-- 1 tidb tidb 36 7月 13 17:17 backupmeta

drwxr-xr-x 6 tidb tidb 4096 7月 14 08:02 v1

历史备份的元数据信息

[tidb@tidb-01 tempdir]$ tiup br log metadata -s "/data/tidb/logbackup/"

Starting component br: /home/tidb/.tiup/components/br/v8.5.4/br log metadata -s /data/tidb/logbackup/

Detail BR log in /tmp/br.log.2026-07-29T10.02.29+0800

[2026/07/29 10:02:29.619 +08:00] [INFO] [collector.go:77] ["log metadata"] [log-min-ts=467647657963683842] [log-min-date="2026-07-13 17:17:22.11 +0800"] [log-max-ts=467663056144957441] [log-max-date="2026-07-14 09:36:21.51 +0800"]

[2026/07/29 10:02:29.619 +08:00] [INFO] [collector.go:77] ["log metadata success summary"] [total-ranges=0] [ranges-succeed=0] [ranges-failed=0] [total-take=1.638022ms]

当前没有log 日志备份任务

[tidb@tidb-01 tempdir]$ tiup br log status --pd 10.0.x.x:2379

Starting component br: /home/tidb/.tiup/components/br/v8.5.4/br log status --pd 10.0.x.x:2379

Detail BR log in /tmp/br.log.2026-07-29T10.03.22+0800

○ No Task Yet.

启动任务报错,获取的是上次遗留,已stop的的备份 tso信息

[tidb@tidb-01 tempdir]$ tiup br log start --task-name brtest --pd 10.0.x.x:2379 -s "/data/tidb/logbackup/" --start-ts '468002689898250240'

Starting component br: /home/tidb/.tiup/components/br/v8.5.4/br log start --task-name brtest --pd 10.0.x.x:2379 -s /data/tidb/logbackup/ --start-ts 468002689898250240

Detail BR log in /tmp/br.log.2026-07-29T10.04.27+0800

[2026/07/29 10:04:27.511 +08:00] [INFO] [collector.go:77] ["log start failed summary"] [total-ranges=1] [ranges-succeed=0] [ranges-failed=1] [unit-name="log start"] [error="failed to check gc safePoint, ts 467663056144957441: GC safepoint 468003020199428096 exceed TS 467663056144957441: [BR:Backup:ErrBackupGCSafepointExceeded]backup GC safepoint exceeded"] [errorVerbose="[BR:Backup:ErrBackupGCSafepointExceeded]backup GC safepoint exceeded\nGC safepoint 468003020199428096 exceed TS 467663056144957441\ngithub.com/pingcap/tidb/br/pkg/utils.CheckGCSafePoint\n\t/workspace/source/tidb/br/pkg/utils/safe_point.go:77\ngithub.com/pingcap/tidb/br/pkg/task.(*streamMgr).setGCSafePoint\n\t/workspace/source/tidb/br/pkg/task/stream.go:396\ngithub.com/pingcap/tidb/br/pkg/task.RunStreamStart\n\t/workspace/source/tidb/br/pkg/task/stream.go:590\ngithub.com/pingcap/tidb/br/pkg/task.RunStreamCommand\n\t/workspace/source/tidb/br/pkg/task/stream.go:508\nmain.streamCommand\n\t/workspace/source/tidb/br/cmd/br/stream.go:232\nmain.newStreamStartCommand.func1\n\t/workspace/source/tidb/br/cmd/br/stream.go:70\ngithub.com/spf13/cobra.(*Command).execute\n\t/root/go/pkg/mod/github.com/spf13/cobra@v1.8.1/command.go:985\ngithub.com/spf13/cobra.(*Command).ExecuteC\n\t/root/go/pkg/mod/github.com/spf13/cobra@v1.8.1/command.go:1117\ngithub.com/spf13/cobra.(*Command).Execute\n\t/root/go/pkg/mod/github.com/spf13/cobra@v1.8.1/command.go:1041\nmain.main\n\t/workspace/source/tidb/br/cmd/br/main.go:40\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:272\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1700\nfailed to check gc safePoint, ts 467663056144957441"]

Error: failed to check gc safePoint, ts 467663056144957441: GC safepoint 468003020199428096 exceed TS 467663056144957441: [BR:Backup:ErrBackupGCSafepointExceeded]backup GC safepoint exceeded。

[tidb@tidb-01 logbackup]$ cat backup.lock

DO NOT DELETE

This file exists to remind other backup jobs won't use this path[tidb@tidb-01 logbackup]$

删除lock文件

[tidb@tidb-01 logbackup]$ rm backup.lock

日志备份任务启动成功

[tidb@tidb-01 logbackup]$ tiup br log start --task-name brtest --pd 10.0.x.x:2379 -s "/data/tidb/logbackup/" --start-ts '2026-07-29 10:00:00+0800'

Starting component br: /home/tidb/.tiup/components/br/v8.5.4/br log start --task-name brtest --pd 10.0.x.x:2379 -s /data/tidb/logbackup/ --start-ts 2026-07-29 10:00:00+0800

Detail BR log in /tmp/br.log.2026-07-29T10.09.08+0800

[2026/07/29 10:09:08.253 +08:00] [INFO] [collector.go:77] ["log start"] [streamTaskInfo="{taskName=brtest,startTs=468003166617600000,endTS=999999999999999999,tableFilter=.}"] [pausing=false] [rangeCount=2]

[2026/07/29 10:09:08.254 +08:00] [INFO] [collector.go:77] ["log start success summary"] [total-ranges=0] [ranges-succeed=0] [ranges-failed=0] [total-take=67.200636ms]

[tidb@tidb-01 logbackup]$ tiup br log status --pd 10.0.x.x:2379

Starting component br: /home/tidb/.tiup/components/br/v8.5.4/br log status --pd 10.0.x.x:2379

Detail BR log in /tmp/br.log.2026-07-29T10.11.59+0800

● Total 1 Tasks.

#1 <

name: brtest

status: ● NORMAL

start: 2026-07-29 10:00:00 +0800

end: 2090-11-18 22:07:45.624 +0800

storage: local:///data/tidb/logbackup

speed(est.): 0.00 ops/s

checkpoint[global]: 2026-07-29 10:11:32.259 +0800; gap=28s

解决方案

删除原日志备份目录的backup.lock文件,建议删除整个日志备份目录或指定新的空目录

拓展

AI

我已经从你刚下载的 tidb/br 源码里把 br log start 的完整逻辑读出来了,根因非常明确。

根因(源码实锤)

br log start 在启动时会先检查存储路径里有没有 backup.lock 锁文件:

  • tidb/br/pkg/task/stream.go:345 — checkLock() 就是判断 metautil.LockFile 是否存在
  • tidb/br/pkg/metautil/metafile.go:38 — LockFile = "backup.lock"

你的 /data/tidb/logbackup/ 里还残留着上一次任务的 backup.lock(以及已备份的日志/.ts 检查点文件)。于是流程走进 RunStreamStart 的"续传分支"(stream.go:577-589):

go

// locked means this is a stream task restart. Or create a new stream task. if locked { logInfo, err := getLogRange(ctx, &cfg.Config) ... cfg.StartTS = logInfo.logMaxTS // ← 这里把你的 --start-ts 覆盖了!

logInfo.logMaxTS 来自 getGlobalCheckpointFromStorage()(stream.go:1685, 1698),它扫描存储里所有 .ts 全局检查点文件取最大值——也就是你看到的 467663056144957441。

而你在命令行传入的 --start-ts 468002689898250240 虽然在 stream.go:233-238 被正确解析进了 cfg.StartTS,但在第 589 行被直接用旧日志的 max TS 覆盖掉了,所以你指定的值完全不生效。

顺带:这一支还会用旧 TSO 调用 cli.PutTask(stream.go:644)把任务重新注册进 PD,所以如果你连跑多次,后面还会撞上 allow only one running task 的限制(stream.go:565-569)。

修复步骤

核心就一条:清掉存储路径里的遗留锁和数据,让 checkLock 返回 false(新任务),--start-ts 才会被采用。

1) 先看 PD 里有没有残留任务注册
tiup br log status --pd 10.0.40.121:2379 --task-name brtest --json
2) 若有(多半现在已被上面的"续传"注册进去了),先停掉
tiup br log stop --pd 10.0.40.121:2379 --task-name brtest
3) 清理存储路径里的遗留文件(在运行 br 的机器上执行,路径即 -s 指向处)
关键要删掉 backup.lock,连同旧的日志/.ts 检查点一起清最干净:
rm -rf /data/tidb/logbackup/*
4) 重新启动,此时 checkLock=false,会使用你指定的 --start-ts
tiup br log start --task-name brtest --pd 10.0.40.121:2379 -s "/data/tidb/logbackup/" --start-ts '468002689898250240'
5) 确认 StartTs 已生效
tiup br log status --pd 10.0.40.121:2379 --task-name brtest --json

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论