# [FAQ] BR PITR 如何保证一致性

## Key Words

PITR 一致性

## Description

假设一个分布式事务 DT1 在三个节点执行   
A节点 1s800ms  
B节点 1s950ms  
C节点 2s100ms  
在每个节点上的 binlog 应该都是按照这个时间记录的。  
如果我指定时间点恢复是 2s000ms 来恢复，A 和 B 应该是回滚成功的，但是 C 节点因为在 2s100ms 才 commit，应该是不会加载成功的，这样就导致了 DT1 这个分布式事务在 C 节点上缺少了一个子交易。
在 TiDB 的 PITR 设计里边是否会根据分布式事务的记录，把 C 节点的恢复时间往前移动一点，把这个 2s100ms 的子交易前滚回来呢？

## Content

1.在进行 PITR 需要的备份的时候，A、B、C 节点都会定期记录下属于自己节点的 local checkpoint ts，代表着该节点上 txn commit ts 早于 checkpoint ts 的数据都已经被备份下来了。然后计算所有节点的最小 checkpoint ts 就是备份 global checkpoint  

2.进行指定时间点恢复的时候，PITR 只能恢复 global checkpoint 之前的时间点，这就保证了不会有数据丢失。这是 PITR 的保证，与数据写入时间无关。比如按照上面给的例子，如果 DT1 的 comit ts < 2s000ms ,用户指定恢复到 2s000ms 恢复，但是 C 的 DT1 数据还没备份下来时，PITR 是会报错不能恢复

3.设计概要请查看[日志备份和 PITR 功能架构](https://github.com/pingcap/docs-cn/blob/57c080287da40c3b4f44ff8684c045fc818a140e/br/br-log-architecture.md)
