问题简介
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